2017-10-26 3 views
2

다음 코드는 내 UIView 중 하나에 DatePicker를 추가하는 코드입니다.UIDatePicker NSRangeException 충돌 iOS 11

UIDatePicker *datePicker = 
     [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 30, 320, 250)]; 
    [datePicker setDatePickerMode:UIDatePickerModeDate]; 
    datePicker.hidden = NO; 
    datePicker.date = [NSDate date]; 
    [datePicker addTarget:self 
       action:@selector(changeDateInLabel:) 
     forControlEvents:UIControlEventValueChanged]; 
    [self.dateView addSubview:datePicker]; 

이 코드는 잠시 동안 사용되었지만 일부 충돌이 발생했습니다. 충돌 만이이 충돌 스택 추적이

Fatal Exception: NSRangeException 
    *** -[__NSArrayM objectAtIndex:]: index 9223372036854775807 beyond bounds [0 .. 1]  
    Fatal Exception: NSRangeException 
     0 CoreFoundation      0x180d87d38 __exceptionPreprocess 
     1 libobjc.A.dylib     0x18029c528 objc_exception_throw 
     2 CoreFoundation      0x180d20c44 _CFArgv 
     3 CoreFoundation      0x180c50cc0 -[__NSArrayM removeObjectAtIndex:] 
     4 UIKit        0x18a3ecaa8 -[UIPickerView selectedRowInComponent:] 
     5 UIKit        0x18ac52224 -[_UIDatePickerMode_Date _dateForYearRow:] 
     6 UIKit        0x18ac4edd8 -[_UIDatePickerMode dateForRow:inCalendarUnit:] 
     7 UIKit        0x18ac4fa70 -[_UIDatePickerMode _updateSelectedDateComponentsWithNewValueInComponent:usingSelectionBarValue:] 
     8 UIKit        0x18ac4fd18 -[_UIDatePickerMode selectedDateComponents] 
     9 UIKit        0x18ac43370 -[_UIDatePickerView _updatedLastSelectedComponentsByValidatingSelectedDateWithLastManipulatedComponent:] 
     10 UIKit        0x18ac427e8 -[_UIDatePickerView _setDate:animated:forced:] 
     11 UIKit        0x18ac42d24 -[_UIDatePickerView _setMode:] 
     12 UIKit        0x18ac42e40 -[_UIDatePickerView setDatePickerMode:] 

이 충돌의 원인이 될 것입니다 무슨에 모든 포인터 모습입니다 아이폰 OS 11에 일이? 감사합니다.

+0

'경계를 넘은 인덱스 9223372036854775807'은 제게는 분명합니다. 피커 데이터에 어떻게 액세스하려고합니까? – LinusGeffarth

+0

'changeDateInLabel :'의 구현은 무엇입니까? 리누스 (Linus)가 말했듯이, 오류는 꽤 자명하다. –

+1

솔직히 말해서 위의 코드의 두 번째 줄에서 충돌이 발생하는 경우 (스택 추적에서 알 수 있듯이 디버거를 사용하거나 로그를 ' setDatePickerMode :'라인과 그 로그가 충돌 전에 발생하는지보기). 새로운 날짜 선택 도구는 모드를 설정했기 때문에 충돌하지 않아야합니다. 그렇게 말하면, 다른 것들을 모두 설정 한 후에'-setDatePickerMode :'를 호출하도록 줄의 순서를 바꾸면, 그 줄을 해결할 수있을 것입니다. –

답변

0

다음 코드를 따르십시오. 도움이됩니다.

UIDatePicker *datePicker=[[UIDatePicker alloc]init]; 
    datePicker.datePickerMode=UIDatePickerModeDate; 
    [self.dateSelectionTextField setInputView:datePicker]; 
    UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; 
    [toolBar setTintColor:[UIColor grayColor]]; 
    UIBarButtonItem *doneBtn=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(ShowSelectedDate)]; 
    UIBarButtonItem *space=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
    [toolBar setItems:[NSArray arrayWithObjects:space,doneBtn, nil]]; 
    [self.dateSelectionTextField setInputAccessoryView:toolBar];. 

-(void)ShowSelectedDate 
{ NSDateFormatter *formatter=[[NSDateFormatter alloc]init]; 
    [formatter setDateFormat:@"dd/MMM/YYYY hh:min a"]; 
    self.dateSelectionTextField.text=[NSString stringWithFormat:@"%@",[formatter stringFromDate:datePicker.date]]; 
    [self.dateSelectionTextField resignFirstResponder]; 
}