关于创建子视图的xcode ios NSRangeException

时间:2014-12-12 18:05:23

标签: ios8 uipickerview uiactionsheet subviews

如何更改以下代码以修复被折旧的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];

}

2 个答案:

答案 0 :(得分:1)

我已经使用iOS 8.0(以及在XCode6.1上运行)及以上版本对其进行了测试,您的代码和UIActionSheet看起来都很不错。

它可以编译,运行并向我显示输出。

这是我得到的。

enter image description here

<强>更新

从iOS 8.0及更高版本开始,UIActionSheet已弃用。它也停止支持添加子视图。这意味着iOS 8.0及更高版本的设备不会向您显示UIDatePicker作为其子视图。如果通知,噩梦不是您在评论下方指定的错误行,但它不再显示数据选择器内部操作表。

来自文档,

  

UIActionSheet不是设计为子类,也不应该添加   查看其层次结构。如果您需要提供更多的表格   自定义比UIActionSheet API提供的,您可以创建   你自己并以模态呈现它   presentViewController:动画:完成:

恕我直言,

  1. 您应该升级您的应用和代码,以便仅从iOS 8.0开始支持。 UIActionSheet将替换为UIAlertController。 [<强>建议

  2. 如果您希望支持iOS 8,那么您可以使用第三方操作表,您可以在所有iOS版本中使用UIActionSheet代替UIActionSheet。这是https://github.com/skywinder/ActionSheetPicker-3.0 [好的选择]

  3. 如果您不想使用第三方并且仍想支持所有iOS版本,那么您可以运行时检查iOS版本,并根据您可以显示UIAlertController和{ {1}}。 [不推荐]

  4. 可能对您有所帮助的链接很少。

    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

答案 1 :(得分:0)

行动表Picker工作得很好,因为我能够直接与开发人员聊天才能开始。我想我花了一点时间来理解它,因为我每天都不在IOS中编程,但是一旦我做了它真棒!感谢上面的Hemang提出的所有建议!

ACTION SHEET PICKER