防止我的 iOS 8 iPad 操作表关闭它的父 ViewController?

Posted

技术标签:

【中文标题】防止我的 iOS 8 iPad 操作表关闭它的父 ViewController?【英文标题】:Prevent my iOS 8 iPad actionsheet from dismissing it's parent ViewController? 【发布时间】:2014-08-26 16:37:17 【问题描述】:

我相信这是一个 ios8 错误,但我不确定。我可以通过一个简单的项目轻松重现它。

在 iOS8 上,我以模态方式将视图控制器呈现为表单,然后在该表单中显示操作表。

- (IBAction)showActionSheet:(id)sender 
UIActionSheet *actionSheet = [[UIActionSheet alloc]
                              initWithTitle:@"How can I stop the modal formsheet from being dismissed with the actionsheet?"
                              delegate:self
                              cancelButtonTitle:@"Cancel"
                              destructiveButtonTitle:@"Destructive"
                              otherButtonTitles:@"Another Button",nil];

[actionSheet showInView:self.view];


- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
// Confirmation message is specific to the filter applied
NSLog(@"clicked %d",buttonIndex);


当此操作表根据用户选择自动关闭时,它也会关闭显示它的视图控制器。有趣的是,如果您在操作表之外点击,它会被关闭,但不会带上视图控制器。

有没有办法解决这个问题?也许是一种在操作表外“伪造”点击的方法?

这是一个演示该行为的简单测试项目:https://www.dropbox.com/s/kecyi4egpckwn69/ActionsheetIssueTest.zip?dl=0

【问题讨论】:

我也看到了。您是否记录了 Apple 的错误? 根据开发者论坛已经打开了一个雷达。我从来没有解决过这个问题,但是直接使用 iOS8 UIAlertController 不会发生。所以我最终在带有 Actionsheet 设置的 UIAlertController 和直接 UIActionsheets 之间切换。 谢谢。我也切换到 UIAlertController,但如果他们修复了这个 bug,那就太好了。 【参考方案1】:

UIAlertView 和 UIActionSheet 在 iOS8 中已被弃用。它们被 UIAlertController 替换。

对于更新现有代码,我发现行之有效的解决方法是替换委托方法的使用:

actionSheet:clickedButtonAtIndex:

使用委托方法:

actionSheet:didDismissWithButtonIndex: 

这将确保在尝试呈现另一个视图控制器之前解除警报控制器。

由于操作表的选择,我在尝试呈现模式的任何地方都遇到了这个问题。这是选择带有操作表以请求相机或照片的照片时的常见范例。使用 didDismissWithButtonIndex: 可以向后兼容 iOS 7。

展望未来,您应该拥抱 UIAlertController。这里有一些阅读:

http://nshipster.com/uialertcontroller/ https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIAlertController_class/index.html

【讨论】:

【参考方案2】:

这里是临时修复。在操作表委托方法中使用以下代码。

[self.presentedViewController dismissViewControllerAnimated:NO completion:nil];

【讨论】:

这里指的是哪种委托方法? clickedButtonAtIndex: 在你的情况下。简而言之,在您以模态方式在侧面操作表委托中呈现任何控制器之前编写上述代码。

以上是关于防止我的 iOS 8 iPad 操作表关闭它的父 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

当用户触摸弹出框外部时,禁用 ipad 上的 ActionSheet 关闭

在 iOS 8.3 for iPad 上关闭 UIAlertView 后键盘弹出

防止在 iPad 上意外关闭 U​​IActionSheet

使用Xcode / Swift或独角兽精灵灰尘在iPad上覆盖(阻止)或关闭iOS

在 Xcode 5 和 iOS 8 上关闭 UIAlertView

使用3D Touch防止在较新的iPad上拖动图像和链接