防止在 iPad 上意外关闭 UIActionSheet
Posted
技术标签:
【中文标题】防止在 iPad 上意外关闭 UIActionSheet【英文标题】:Prevent accidental dismissal of UIActionSheet on iPad 【发布时间】:2012-09-07 12:47:01 【问题描述】:我正在使用 UIActionSheet 在 iPad 应用程序中向用户呈现两个选项。用户选择一个或其他选项,UIActionSheetDelegate 处理其余的。但是,如果用户不小心点击了 iPad 屏幕上的任何其他位置,UIActionSheet 会自动关闭,并且两个选项都不会被选中。如何防止 UIActionSheet 自动关闭,从而强制用户选择两个选项之一?
【问题讨论】:
操作表是否在 UIPopover 中? 【参考方案1】:如果操作表位于 UIPopover 内,解决方法是使用 UIPopoverDelegate 来阻止弹出框在操作表存在时关闭。另一种解决方案是使用 UIAlertView 代替,除了与警报交互之外,它不会允许任何事情发生。可能不是您的解决方案。如果您触摸屏幕的不同部分,我不知道 UIActionSheet 会自行关闭的任何其他方式。
为操作表可见时创建一个 BOOL 变量
BOOL actionSheetVisible; //in header file
//in @implementation file
-(void)displayAlert
actionSheetVisible = YES;
//code to display UIAction sheet...
#pragma mark PopoverControllerDelegate method
-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popover
if (actionSheetVisible)
return NO;
return YES;
#pragma mark UIAlerViewDelegate
...actionSheet:(UIActionSheet *)sheet selectedObjectAtIndex:(NSUInteger)index ... //not sure what this method is at the moment
actionSheetVisible = NO;
//handle action sheet
【讨论】:
是的,它在 UIPopover 中,因为在 iPad 上使用时它通常会自动出现(即我自己没有将它放在 UIPopover 中)。因此,如果我继续让我的类符合 UIPopoverDelegate,那么我该如何防止弹出框在屏幕外被点击时意外关闭? 查看我的编辑,您只需确保将 popoverController 委托设置为 self/您管理 UIActionSheet 的类 谢谢。我试了一下。不幸的是, popoverControllerShouldDismissPopover 没有被调用。操作表的委托是自我,但我不知道我会在哪里声明它包含在其中的弹出框的委托。通常,如果您使用它,您会专门识别弹出框的代表。在这种情况下,我不是自己创建弹出框,它是与操作表一起免费提供的。我将如何设置它的委托? 你在使用来自 GitHub 的自定义类吗?这是一个 iPad 问题,对吧? 是的,iPad。没有自定义类或任何花哨的东西。我只是以通常的方式分配和初始化一个 UIActionSheet 并使用 showFromRect 呈现它。 iPad 操作系统会自动为操作表创建一个小弹出框。【参考方案2】:如何将手势控制器添加到不执行任何操作的应用程序窗口?或者尝试将其添加到工作表下方的视图中?确保完成后将其删除;)
【讨论】:
【参考方案3】:我将抛出另一个想法 - 在您显示操作表之前,将覆盖整个屏幕的透明视图添加到窗口,然后设置视图。 userInteractionEnabled = NO,然后在关闭操作表时移除视图。 [我没有在 iPad 上测试过,但在手机上使用过这种技术]
【讨论】:
很遗憾,使用此方法仍会关闭操作表。以上是关于防止在 iPad 上意外关闭 UIActionSheet的主要内容,如果未能解决你的问题,请参考以下文章