xcode ios NSRangeException 创建子视图
Posted
技术标签:
【中文标题】xcode ios NSRangeException 创建子视图【英文标题】:xcode ios NSRangeException on creating subviews 【发布时间】:2014-12-12 18:05:22 【问题描述】:如何更改下面的代码来修复 pickerView 被贬值的问题?
这段代码以前运行良好,并且完成了这项工作。我暂时不需要编译,当我修复另一个问题时,当它碰到子视图时,我碰到了这个 NSRangeException。该代码用于与以前版本的 ios 一起使用。任何想法将不胜感激。
由于未捕获的异常“NSRangeException”而终止应用程序,原因: '-[__NSArrayM objectAtIndex:]: 索引 1 超出范围 [0 .. 0]'
首先抛出调用堆栈:...等等等
经过更多阅读,我发现 pickerView 已贬值。
永远不会明白为什么 Apple 可以更改代码!
-(void)willPresentActionSheet:(UIActionSheet *)actionSheet
switch ([actionSheet tag] )
case 1://date
NSDate *d;
UIDatePicker *pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 50, 100, 116)];
[pickerView setTag:100+[actionSheet tag]];
[pickerView setDatePickerMode:UIDatePickerModeDate];
if( DefDate == @"" || DefDate == Nil ) DefDate = [fun0 GetCurrentDate];
d = [fun0 GetDatefromString:DefDate];
[pickerView setDate:d animated:YES];
[actionSheet addSubview:pickerView];
[pickerView release];
NSArray *subViews = [actionSheet subviews];
**// Line below is where is where it dumps:**
[[subViews objectAtIndex: SelectButtonIndex] setFrame:CGRectMake(20, 266, 280, 46)];
[[subViews objectAtIndex:CancelButtonIndex] setFrame:CGRectMake(20, 317, 280, 46)];
break;
- (IBAction)btnDate:(id)sender
UIActionSheet *asheet = [[UIActionSheet alloc]
initWithTitle:@"Pick the date of your meal"
delegate:self
cancelButtonTitle:@""
destructiveButtonTitle:nil
otherButtonTitles:@"Select"
, nil];
[asheet setTag:1];
[asheet showInView:[self.view superview]];
[asheet setFrame:CGRectMake(0, 117, 320, 383)];
[asheet release];
【问题讨论】:
【参考方案1】:我已经使用 iOS 8.0(并在 XCode6.1 上运行)及更高版本对其进行了测试,您的代码和 UIActionSheet
看起来都不错。
它可以编译、运行并向我显示输出。
这就是我得到的。
更新:
从 iOS 8.0 及更高版本开始,UIActionSheet
已折旧。它也停止支持添加子视图。这意味着装有 iOS 8.0 及更高版本的设备不会将 UIDatePicker
显示为它的子视图。如果注意到,噩梦不是您在评论下方指定的错误行,而是它不再在操作表中显示数据选择器。
来自文档,
UIActionSheet 不是为子类而设计的,也不应该添加 对其层次结构的看法。如果您需要展示一张包含更多内容的表格 自定义比 UIActionSheet API 提供的,您可以创建 你自己的并以模态方式呈现它 presentViewController:animated:completion:.
恕我直言,
您应该升级您的应用程序和代码以仅从 iOS 8.0 开始支持。 UIActionSheet
将被 UIAlertController
替换。 [建议]
如果您希望支持 iOS 8,那么您必须使用第三方操作表,您可以在所有 iOS 版本中使用它来代替 UIActionSheet
。这是https://github.com/skywinder/ActionSheetPicker-3.0 [不错的选择]
如果您不想使用第三方但仍想支持所有 iOS 版本,那么您可以运行时检查 iOS 版本,并在此基础上显示UIActionSheet
和UIAlertController
。 [不推荐]
几个链接可以帮助你。
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIAlertController_class/
http://nshipster.com/uialertcontroller/
Add UIPickerView in UIActionSheet from IOS 8 not working
Showing a UIPickerView with UIActionSheet in iOS8 not working
【讨论】:
谢谢你的例子。进一步看,我意识到当它得到异常时它实际上更进一步。请参阅我在上面添加的新代码。谢谢!!!【参考方案2】:Action Sheet Picker 非常好用,因为我可以直接与开发人员聊天以开始工作。我想我花了一点时间才开始理解它,因为我不是每天都在 IOS 中编程,但是一旦我做了它就很棒!感谢以上赫芒的所有建议!
ACTION SHEET PICKER
【讨论】:
以上是关于xcode ios NSRangeException 创建子视图的主要内容,如果未能解决你的问题,请参考以下文章