cordova datepicker插件在iOS8中不工作:未设置UITableView数据源
更新到iOS8后,cordova datepicker插件无法工作。它崩溃了,并显示以下消息: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“未设置UITableView数据源” 但是我在插件源代码中没有看到任何与UITableView相关的代码。我不知道,也许UIDatePicker中有一个内部UITableView 以下是代码我删除了一些非相关代码以便于阅读:cordova datepicker插件在iOS8中不工作:未设置UITableView数据源,uitableview,cordova,datepicker,ios8,uidatepicker,Uitableview,Cordova,Datepicker,Ios8,Uidatepicker,更新到iOS8后,cordova datepicker插件无法工作。它崩溃了,并显示以下消息: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“未设置UITableView数据源” 但是我在插件源代码中没有看到任何与UITableView相关的代码。我不知道,也许UIDatePicker中有一个内部UITableView 以下是代码我删除了一些非相关代码以便于阅读: - (UIPopoverController *)createPop
- (UIPopoverController *)createPopover:(NSMutableDictionary *)options {
UIView *datePickerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, pickerViewWidth, pickerViewHeight)];
if(!self.datePicker){
self.datePicker = [self createDatePicker:options frame:frame];
[self.datePicker addTarget:self action:@selector(dateChangedAction:) forControlEvents:UIControlEventValueChanged];
}
NSDateFormatter *formatter = [self createISODateFormatter:@"yyyy-MM-dd'T'HH:mm:ss'Z'" timezone:[NSTimeZone defaultTimeZone]];
NSString *dateString = [options objectForKey:@"date"];
self.datePicker.date = [formatter dateFromString:dateString];// if remove this line, it works fine
[datePickerView addSubview:self.datePicker];
UIViewController *datePickerViewController = [[UIViewController alloc]init];
datePickerViewController.view = datePickerView;
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:datePickerViewController];
popover.delegate = self;
[popover setPopoverContentSize:CGSizeMake(pickerViewWidth, pickerViewHeight) animated:NO];
[popover presentPopoverFromRect:anchor inView:self.webView.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
return popover;
}
这一行:
self.datePicker.date = [formatter dateFromString:dateString];
最终导致崩溃,通过调试,我发现dateString的值为:
2014-10-17T10:0:00Z
2014-10-17T20:0:00Z
它从第二个显示器崩溃,第一次总是可以的
你能给我一些线索吗?谢谢最后我发现了问题: cordova DatePicker的源代码,重用UIDatePicker实例:
if(!self.datePicker){
self.datePicker = [self createDatePicker];
[self.datePicker addTarget];
}
而且,它在iOS7中运行良好,但在iOS8中导致崩溃
在iOS8中,不要在多UIView中共享UIDatePicker实例,因此我将代码修改为:
// in iOS8, UIDatePicker couldn't be shared in multi UIViews, it will cause crash. so create new UIDatePicker instance every time
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
self.datePicker = [self createDatePicker:options frame:frame];
[self.datePicker addTarget:self action:@selector(dateChangedAction:) forControlEvents:UIControlEventValueChanged];
}else{
if(!self.datePicker){
self.datePicker = [self createDatePicker:options frame:frame];
[self.datePicker addTarget:self action:@selector(dateChangedAction:) forControlEvents:UIControlEventValueChanged];
}
}
希望这能帮助像我这样的人最终我发现了问题: cordova DatePicker的源代码,重用UIDatePicker实例:
if(!self.datePicker){
self.datePicker = [self createDatePicker];
[self.datePicker addTarget];
}
而且,它在iOS7中运行良好,但在iOS8中导致崩溃
在iOS8中,不要在多UIView中共享UIDatePicker实例,因此我将代码修改为:
// in iOS8, UIDatePicker couldn't be shared in multi UIViews, it will cause crash. so create new UIDatePicker instance every time
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
self.datePicker = [self createDatePicker:options frame:frame];
[self.datePicker addTarget:self action:@selector(dateChangedAction:) forControlEvents:UIControlEventValueChanged];
}else{
if(!self.datePicker){
self.datePicker = [self createDatePicker:options frame:frame];
[self.datePicker addTarget:self action:@selector(dateChangedAction:) forControlEvents:UIControlEventValueChanged];
}
}
希望这能帮助像我这样的人这是你使用的插件吗?确切地关于此问题的几个问题您的代码没有在该插件的最新版本上修复此问题,您使用的是哪个版本?我有一个关于此插件的拉取请求正在挂起,用于修复此问题。与此同时,你可以在这里使用我的叉子:这不仅限于科尔多瓦。我在iOS 9上的常规本机应用程序中也遇到了同样的问题。在我的例子中,我有一个带有UIDatePicker的视图,它显示在popover视图控制器中。每次需要显示时创建一个新的UIDatePicker实例解决了我的问题。这就是你使用的插件吗?确切地关于此问题的几个问题您的代码没有在该插件的最新版本上修复此问题,您使用的是哪个版本?我有一个关于此插件的拉取请求正在挂起,用于修复此问题。与此同时,你可以在这里使用我的叉子:这不仅限于科尔多瓦。我在iOS 9上的常规本机应用程序中也遇到了同样的问题。在我的例子中,我有一个带有UIDatePicker的视图,它显示在popover视图控制器中。每次需要显示时创建一个新的UIDatePicker实例解决了我的问题。