UIActionSheet在iPad /非iPhone上崩溃

时间:2010-09-18 21:08:22

标签: iphone cocoa-touch ipad ios uiactionsheet

当我在控制台中查看时,我收到此消息

2010-09-18 17:04:05.284 Wasted Time[8998:207] *** Assertion failure in -[UIActionSheet showInView:], /SourceCache/UIKit_Sim/UIKit-1145.66/UIAlert.m:7073
2010-09-18 17:04:05.286 Wasted Time[8998:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: view != nil'
2010-09-18 17:04:05.286 Wasted Time[8998:207] Stack: (
    42272848,
    43430700,
    42010379,
    811796,
    3796273,
    3862560,
    9631,
    3616645,
    3688229,
    3682846,
    3690662,
    3686119,
    4983946,
    71264534,
    71263781,
    71207378,
    71206706,
    3003734,
    3030334,
    3011831,
    3043800,
    51265916,
    41552028,
    41547944,
    3002913,
    3036018,
    8314
)
terminate called after throwing an instance of 'NSException'

代码如下:

- (void)viewDidLoad {
    BOOL    continueYesNo;
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    continueYesNo = [prefs boolForKey:@"keyContinueMeeting"];   
    if (continueYesNo) {
        NSString *message_continue = [[NSString alloc] initWithFormat:@"Do you want to Continue the Prior Meeting"];
        UIActionSheet *actionSheet = [[UIActionSheet alloc] 
            initWithTitle:message_continue 
            delegate:self
            cancelButtonTitle:@"Reset" 
            destructiveButtonTitle:@"Continue"
            otherButtonTitles:nil];
        [actionSheet showInView:self.view];
        [actionSheet release];
        [message_continue release];
    }
}

它在iPhone和iPhone模拟器中运行良好,但在iPad模拟器中崩溃。

6 个答案:

答案 0 :(得分:5)

错误消息显示:

  

无效参数不满足:view!= nil

可能来自这条线:

[actionSheet showInView:self.view];

既然你说它适用于iPhone但不适用于iPad,这意味着iPad进入此行所需的代码路径可能与iPhone到达此行所需的代码路径不同。这意味着可能没有为iPad设置视图控制器的view属性。

我的猜测:您忘记在Interface Builder中连接此视图控制器正在使用的xib的iPad版本的view插座。

答案 1 :(得分:3)

我也有这个问题,但我使用的是[actionSheet showInView:[self.view window]];(修复了另一个错误,只有一半的取消按钮可以选择)。

现在我有条件地将其更改为iPad上的[actionSheet showInView:self.view];

我发现最好不要在iPad上使用UIActionSheetStyleBlackTranslucent的风格 - iPad有它自己的风格,设置这似乎添加了取消按钮(默认情况下在iPad上没有显示)。

答案 2 :(得分:0)

这样做:

[self performSelectorOnMainThread:@selector(choosePhoto) withObject:nil waitUntilDone:NO];

-(void)choosePhoto
{

    UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@""
                                                  delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil
                                         otherButtonTitles:@"Take Photo", @"Choose from gallery", nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    actionSheet.tag = 1;
    [actionSheet showInView:self.view];
    [actionSheet release];
}

为我工作

答案 3 :(得分:0)

我认为问题是视图还没有出现。把它放在viewDidAppear中:它应该可以正常工作。

答案 4 :(得分:0)

对于像我这样可能使用UIActionSheet的人与原始问题略有不同,但仍然在iPad上失败,我一直在使用:

[actionSheet showFromRect:m_view.bounds inView:m_view animated:YES];
[actionSheet release];

...适用于iPhone但在iPad上失败。

此示例适用于我在两个设备上的特定应用:

[actionSheet showInView:m_view];
[actionSheet release];

问候,大卫

答案 5 :(得分:0)

这是一个老问题,但我今天遇到了同样的问题。 我有一个UIViewController的xib文件,这是iPhone和iPad常见的,showInView上的UIActionSheet方法导致iPad应用程序崩溃。

原告在showInView中调用了viewDidAppear,而不是viewDidLoad为我修复了它。也许所有的IB连接都不是在iPad上调用viewDidLoad时制作的。

(我的UIViewController被推到UINavigationController上,所以我想知道增加的动画时间是否是导致整个问题的原因_