我正在通过“开始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的摘要,并且还无法对其中的任何内容进行任何处理。
我感谢任何和所有的支持。
此致
史蒂夫奥沙利文答案 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];
}
它适用于我。