UIDatePicker自更新到ios 8后查看问题

时间:2014-09-19 08:53:32

标签: ios objective-c ios8 uidatepicker

我刚刚更新到iOS 8,我的应用程序出现问题,除了动作表上的日期选择器之外的所有内容都有效。选择操作表以显示操作表以及添加为子视图的日期选择器时,应用程序崩溃。我发现问题代码是:

-(void)willPresentActionSheet:(UIActionSheet*)actionSheet{

theDatePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, 40, 320, 216)];
[actionSheet addSubview:theDatePicker];


NSArray *subviews = [actionSheet subviews];
[[subviews objectAtIndex:0]setFrame:CGRectMake(20, 266, 280, 46)]; //this line
[[subviews objectAtIndex:1]setFrame:CGRectMake(20, 317, 280, 46)]; //also this one

}

控制台日志产生:

-[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]' 

之前我通过将每个索引更改为2&来解决它(非常糟糕)。 3虽然有效但实施起来很混乱。

这是实际的实施:

-(void)willPresentActionSheet:(UIActionSheet*)actionSheet{

 theDatePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, 40, 320, 216)];
 [actionSheet addSubview:theDatePicker];


 NSArray *subviews = [actionSheet subviews];
 [[subviews objectAtIndex:0]setFrame:CGRectMake(20, 266, 280, 46)];
 [[subviews objectAtIndex:1]setFrame:CGRectMake(20, 317, 280, 46)];

}

-(void)datePickerViewFromInput:(NSString*)title{
    SheetPicker=[[UIActionSheet alloc]initWithTitle: title delegate:self cancelButtonTitle:@"Cancel"        destructiveButtonTitle:nil otherButtonTitles:@"Set", nil];
[SheetPicker showInView:self.view ];
[SheetPicker setFrame:CGRectMake(0,117, 325, 383)];
theDatePicker.datePickerMode = UIDatePickerModeDate;
NSDateFormatter *Formatter = [[NSDateFormatter alloc]init];
[Formatter setDateFormat:@"MM/dd/yyyy"];

}

如果我删除了问题代码,则会显示操作表,但不再有日期选择器。 (我不知道为什么)

有关如何解决此问题的任何想法?

提前致谢

2 个答案:

答案 0 :(得分:2)

可能苹果改变了视图层次结构,there is a note in the docs并没有真正涵盖你的情况,但仍然给我们提示,发生了什么:

  

UIActionSheet不是为子类设计的,也不应该在其层次结构中添加视图。如果您需要提供比UIActionSheet API提供的更多自定义的工作表,您可以创建自己的工作表并使用presentViewController以模态方式呈现它:animated:completion:。

正如UIAlerView苹果公司不希望我们改变它的体验 - 因为他们对视图层次结构做了一些修改。

最安全的解决方案是按照apple的建议:创建一个视图控制器并以模态方式呈现它。

答案 1 :(得分:0)

iOS 8中的UIActionSheet有一个幻灯片更改。尝试此代码。

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleActionSheet];

[alert.view addSubview:theDatePicker];   
[self presentViewController:alert animated:YES completion:nil];