iPad崩溃,UIActionSheet显示在子视图控制器上

时间:2011-12-06 17:39:44

标签: ios cocoa-touch ipad uikit uiactionsheet

如果有人问过我道歉,但我似乎无法在任何地方找到它。我甚至在一个演示项目中重新创建了我的问题,以防你们想要亲眼看到它,尽管我不知道应该在哪里发布它。

我有一个基于xibless UINavigationController的应用程序。我的一些子ViewControllers在顶部的右侧有一个按钮,然后显示一个UIActionSheet。我的应用程序是专为iPhone和iPad设计的,所以当我准备好显示UIActionSheet时,我会这样做:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:@"%@ Menu", [self title]] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Email", @"Print", nil];
[actionSheet setActionSheetStyle:UIActionSheetStyleDefault];
if ([actionSheet respondsToSelector:@selector(showFromBarButtonItem:animated:)])
    [actionSheet showFromBarButtonItem:[[self navigationItem] rightBarButtonItem] animated:YES];
else [actionSheet showInView:[self view]];
[actionSheet release];

在iPad上,我试图将UIActionSheet显示在右侧的条形按钮上,在iPhone上它应该从底部滑入。所有这一切都很美妙。

不幸的是,如果你点击按钮并在iPad上显示菜单,然后点击应用程序左上角的后退按钮,菜单就不会被忽略。相反,UINavigationController尽职尽责地回弹,UIActionSheet仍然存在。如果你尝试点击菜单上的东西,你当然会崩溃。如果用户在屏幕上点击了其他任何内容而不是“后退”按钮,则菜单会正确解除。

如果您在iPhone上尝试此测试,一切都按预期工作。没有问题。

我的演示项目有一个AppDelegate和一个ViewController就是这样。 AppDelegate构建了NSDictionaries的NSDictionary,因此我有一个模型,我可以通过它来演示这个问题。 ViewController显示字典的所有键,如果相应的值是NSDictionary,您可以点击它以向下钻取。

2 个答案:

答案 0 :(得分:7)

这是一个有趣的问题。以下是UIActionSheet Class Reference所说的内容。

  

在iPad上,此方法在弹出窗口中显示操作表并添加   拥有弹出窗口直通列表按钮的工具栏   观点。因此,工具栏中的点击会产生动作方法   调用相应的工具栏项。如果你想要弹出窗口   当你点击一个不同的工具栏项时被解雇,你必须   在动作处理程序方法中实现该行为。

因此,当您显示操作表时,它会自动创建UIPopoverController并将包含的工具栏(或导航栏)设置为popover的直通视图,从而允许触摸事件继续。我认为最好的办法是为您的操作表创建一个实例变量,并强制它在-viewWillDisappear:中可见时忽略。

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if (self.actionSheet.window) // If action sheet is on screen, window is non-nil
        [self.actionSheet dismissWithClickedButtonIndex:self.actionSheet.cancelButtonIndex animated:animated];
}

答案 1 :(得分:0)

您是否尝试过强制解除viewWillDisappear上的ActionSheet?

试试这个:

// In MyViewController.m

    - (void)viewWillDisappear:(BOOL)animated {

        [actionSheet dismissWithClickedButtonIndex:nil animated:animated];

    }

*崩溃听起来像是可能的EXC_BAD_ACCESS。您可能会丢失指向' actionSheet'当您因发布而更改视图时可以继续在.h文件中继续引用actionSheet并管理发布的时间。

*另请参阅有关解雇消息的信息的文档:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIActionSheet_Class/Reference/Reference.html