【问题标题】:UIDatePicker NSRangeException crash iOS 11UIDatePicker NSRangeException 崩溃 iOS 11
【发布时间】:2017-10-26 22:36:24
【问题描述】:

我有以下代码将 DatePicker 添加到我的 UIView 之一。

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];

这段代码已经存在了一段时间,但我们现在已经注意到一些随机崩溃。崩溃仅发生在 iOS 11 中。这就是崩溃的堆栈跟踪的样子

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:]

关于什么会导致这次崩溃的任何指针? 谢谢

【问题讨论】:

  • index 9223372036854775807 beyond bounds [0 .. 1] 对我来说似乎很清楚。您如何尝试访问选择器的数据?
  • 老实说,如果崩溃发生在上面代码的第二行(堆栈跟踪表明,但可以使用调试器或通过在-setDatePickerMode: 行之后粘贴一个日志,并查看该日志是否在崩溃之前发生)。一个全新的日期选择器不应该仅仅因为您在其上设置了模式而崩溃。话虽如此,也许如果你重新排列你的行,以便在设置完其他所有内容后调用-setDatePickerMode:,它会解决它吗?
  • @CharlesSrstka 我同意。在设置选择器模式之前,我会尝试设置选择器的 date 属性,看看是否有帮助。
  • 我会尝试将其简化为可能导致崩溃的最简单程序,并将项目附加到雷达报告中。
  • 同意这是一个框架错误,基于符号名称我怀疑它正在尝试验证在 iOS 11 中不再适用的东西。如果你删除并重新安装应用程序,它是否仍然崩溃(即新鲜iOS 11 安装?)?。

标签: ios objective-c uidatepicker


【解决方案1】:

遵循此代码。它对您有帮助。

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];
}

【讨论】:

  • 你想对这个答案说什么?
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2018-03-25
  • 2018-03-15
相关资源
最近更新 更多