【问题标题】:dismissViewController doesn't dismiss presented view controller when using universal storyboard使用通用故事板时,dismissViewController 不会关闭呈现的视图控制器
【发布时间】:2014-12-04 21:24:46
【问题描述】:

我发现了一种情况,导致dismissViewController:animated:completion 不关闭已呈现的视图控制器。虽然它确实在运行 iOS 8 的 iPad 上关闭,但它不会在运行 iOS 7.1 的 iPad 上关闭。我试过selfself.presentingViewControllerself.presentedViewController - 什么都不做。我已经用 Xcode 6.0 和 6.1 beta 试过了。虽然我确实认为这是一个错误,但可以采取什么措施来解决它并强制关闭该视图控制器,确保它适用于运行 iOS 7 和 8(显示为弹出框)的 iPad 和运行 iOS 7 和 8 的 iPhone(呈现全屏)?

我创建了一个非常简单的项目,您可以用它来尝试:Xcode project zip

项目设置:

  • 面向 iOS 7+ 的通用故事板
  • 实现 Popover Presentation segue
  • 实现在弹出框内关闭弹出框的功能

遇到意外行为:

  1. 打开提供的 Xcode 项目
  2. 在 iPad iOS 7 模拟器上运行应用程序
  3. 点击顶部单元格以显示弹出框
  4. 点击弹出框中的单元格将其关闭

【问题讨论】:

    标签: ios objective-c ipad uipopovercontroller


    【解决方案1】:

    问题在于您尝试处理弹出框的方式。要关闭弹出框,您应该使用dismissPopoverAnimated 方法而不是dismissViewControllerAnimated

    我认为您必须做更多的工作才能完成针对这两个 iOS 版本的任务。根视图控制器应该有一些属性来将创建的弹出框与 PoppedUpTVC 存储为弹出框内容,并且 PoppedUpTVC 必须要求根视图控制器对存储的弹出框执行 dismissPopoverAnimated 方法以关闭它。

    要获得对弹出框的引用,请在prepareForSegue 中尝试:

    if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) {
        UIStoryboardPopoverSegue *popoverSegue = (UIStoryboardPopoverSegue *)segue;
        yourDestViewController.propertyToStorePopover = popoverSegue.popoverController;
    }
    

    【讨论】:

    • 当您使用 Popover Presentation segue 时,如何获得对 UIPopoverController 的引用? presentationController 属性仅在 iOS 8 中可用,没有 popoverController 属性。
    • 尝试使用prepareForSegue或通过代码执行init(contentViewController viewController: UIViewController)func presentPopoverFromRect(_ rect: CGRect, inView view: UIView, permittedArrowDirections arrowDirections: UIPopoverArrowDirection, animated animated: Bool)
    • 嗨@Joey - 这正是我面临的情况。您能否更新您的问题以发布您的 prepareForSegue 中的确切内容?
    • @Lavanya 我已经用我用来获取弹出框控制器引用的代码编辑了答案。
    • 谢谢@Joey - 这真的很有帮助!再次感谢
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 2018-12-12
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多