3

我正在完成“开始 iPad 应用程序开发”,并在第 3 章中被挂断,在那里我创建了一个与操作表一起工作的项目。

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

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”而终止应用程序,原因:“无效参数不满足:视图!= 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];

}

我是否遗漏了一些明显的东西,或者问题比这里显示的更多?我已经查看了 showInView 的摘要,但还无法预测那里的任何内容。

我感谢任何和所有的帮助。

问候,

史蒂夫奥沙利文

4

5 回答 5

11

在 viewDidLoad 方法中,视图没有完全设置。window 属性未连接。

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];
}
于 2010-06-02T10:46:40.013 回答
1

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

于 2010-06-01T10:31:04.630 回答
0

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

Eiko 的回答仍然正确。

于 2012-02-14T15:18:50.807 回答
0

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

于 2010-06-28T21:22:18.530 回答
0

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

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

这对我来说可以。

于 2014-06-12T11:31:57.817 回答