试图调试'[UIActionSheet showInView:]'中的'断言失败'错误

时间:2010-06-01 02:58:50

标签: objective-c ipad uiactionsheet

我正在通过“开始iPad应用程序开发”工作,我在第3章中已经挂断了,我已经创建了一个与Action Sheet一起工作的项目。

现在,我的应用程序很好地加载到模拟器中没有我知道的错误,但是当它运行时,它会在调试器窗口中显示以下错误而崩溃:

  

2010-05-31 19:44:39.703 UsingViewsActionSheet [49538:207] ***断言   失败 - [UIActionSheet showInView:],   /SourceCache/UIKit_Sim/UIKit-1145.66/UIAlert.m:7073

     

2010-05-31 19:44:39.705 UsingViewsActionSheet [49538:207] ***   由于未捕获的异常而终止应用程序   'NSInternalInconsistencyException',原因:'参数无效   满足:view!= nil

我确信这是应用程序基于我使用断点而中断的块。

//在加载视图后实施viewDidLoad以进行其他设置,通常是从笔尖。

- (void)viewDidLoad { UIActionSheet *action = [[UIActionSheet alloc] initWithTitle:@"This is my Action Sheet!" delegate:self cancelButtonTitle:@"OK" destructiveButtonTitle:@"Delete Message!" otherButtonTitles:@"Option 1", @"Option 2", @"Option 3", nil];

[action showInView:self.view];  // <-- This line seems to trigger the crash....
[action release];
[super viewDidLoad];

[action showInView:self.view]; // <-- This line seems to trigger the crash.... [action release]; [super viewDidLoad];

我是否遗漏了一些明显的东西,或者问题还存在于此处所示的问题上?我已经查看了showInView的摘要,并且还无法对其中的任何内容进行任何处理。

我感谢任何和所有的支持。

此致

史蒂夫奥沙利文

5 个答案:

答案 0 :(得分:11)

在viewDidLoad方法中,视图未完全设置。窗口属性未连接。

NSLog(@"View: %@; Window: %@",[self.view description], [self.view.window description]);

可能会显示窗口为null / nil。

根据您的设计,您可能只需在主线程上排队就可以了:

-(void) showMyActionSheet
{
    UIActionSheet *action = [[UIActionSheet alloc] initWithTitle:@"This is my Action Sheet!" delegate:self cancelButtonTitle:@"OK" destructiveButtonTitle:@"Delete Message!" otherButtonTitles:@"Option 1", @"Option 2", @"Option 3", nil]; 
    [action showInView:self.view];
    [action release];
}

- (void)viewDidLoad 
{
    [super viewDidLoad]; 
    [self performSelectorOnMainThread:@selector(showMyActionSheet) withObject:nil waitUntilDone:NO];
}

答案 1 :(得分:1)

我刚遇到同样的问题。 我正在转换现有的iPhone应用程序以运行通用。 我有几个调用UIAlertViews的按钮工作正常,但我有一个调用动作表的按钮。 它产生了同样的错误。在我的视图控制器中的ipadview.xib中,我将“视图”错误链接到窗口,当我应该将它链接到按钮时。 它现在工作正常。 希望这可以帮助。 (ps我是一个完整的新手如果这没有帮助原谅) 尼尔

答案 2 :(得分:0)

我正在完成相同的章节,本书的作者在这里解决http://p2p.wrox.com/book-beginning-ipad-application-development/79379-ch-3-usingviews-alert-actionsheet.html但如果我是你,我会将Eiko的回答作为答案投票,因为它完成了示例的行为,而作者您是否创建了一个按钮,您在应用程序启动后单击该按钮以查看工作表。

答案 3 :(得分:0)

对于这个话题的任何后来者来说,这仍然是5.0(9A334)iPad模拟器和物理设备(iPad)中的一个问题。

Eiko的回答仍然正确。

答案 4 :(得分:0)

我最近修复了ActionSheet的断言失败:

UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
    if ([window.subviews containsObject:self.view]) {
        [action showInView:self.view];
    } else {
        [action showInView:window];
    }

它适用于我。