我刚刚更新到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"];
}
如果我删除了问题代码,则会显示操作表,但不再有日期选择器。 (我不知道为什么)
有关如何解决此问题的任何想法?
提前致谢
答案 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];