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 版本,并在此基础上显示UIActionSheetUIAlertController。 [不推荐]

几个链接可以帮助你。

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 创建子视图的主要内容,如果未能解决你的问题,请参考以下文章

xcode 怎么安装ios模拟器

如何往xcode6添加iOS6模拟器

XCode 6.0.1 ios 7 自动布局

iOS开发 适配iOS10以及Xcode8

iOS - Xcode 常用插件

Xcode11的设备支持文件(iOS 14)[关闭]