iPad在子视图控制器中显示UIActionSheet时崩溃

3

如果我重复了之前的问题,我很抱歉,但我似乎找不到它。我甚至在演示项目中重新创建了我的问题,以便你们中的任何人想要亲自查看,尽管我不知道我应该在哪里发布它。

我有一个基于xibless UINavigationController的应用程序。我的一些子视图控制器在顶部右侧有一个按钮,然后显示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构建了一个NSDictionary的NSDictionaries,只是为了让我有一个模型可以递归演示问题。 ViewController显示字典的所有键,如果相应的值是NSDictionary,则可以点击它进行深入钻取。
2个回答

7
这是一个有趣的问题。以下是UIActionSheet类参考文档中的说明。

在iPad上,该方法会在弹出窗口中显示操作表,并将拥有按钮的工具栏添加到弹出窗口的穿透视图列表中。因此,在工具栏中的轻击会导致相应工具栏项的操作方法被调用。如果您希望在轻击不同的工具栏项时关闭弹出窗口,您必须在操作处理程序方法中实现该行为。

因此,当您显示操作表时,它会自动创建一个UIPopoverController并将包含的工具栏(或导航栏)设置为弹出窗口的穿透视图,允许触摸事件继续。我认为最好的方法是为您的操作表创建一个实例变量,并在-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];
}

赢家,赢家,鸡晚餐!我也学到了东西。我不知道窗口属性只在视图在屏幕上时才填充。非常感谢。 - bmauter
非常感谢你,马克。你救了我的一天。我已经为类似的问题苦苦挣扎了数小时。你应该得到一杯啤酒。 - Wayne Lo

0
你尝试过在viewWillDisappear中强制取消ActionSheet吗?
试试这个:
// In MyViewController.m

    - (void)viewWillDisappear:(BOOL)animated {

        [actionSheet dismissWithClickedButtonIndex:nil animated:animated];

    }

*崩溃听起来像是可能的EXC_BAD_ACCESS。当您释放时,由于更改视图,您可能会失去对“actionSheet”的指针引用。最好在.h文件中保留对actionSheet的引用并管理您的释放时间。

*还可以查看文档以获取有关dismiss消息的信息:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIActionSheet_Class/Reference/Reference.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接