在 iPhone 和 iPad 上清除视图控制器

Posted

技术标签:

【中文标题】在 iPhone 和 iPad 上清除视图控制器【英文标题】:Clean view controller dismissal on iPhone & iPad 【发布时间】:2019-04-04 09:06:11 【问题描述】:

我有一个用于编辑对象细节的UIViewController 子类,它被推送到iPhone 上的UINavigationController

在 iPad 上,它是 UINavigationController 中的根视图控制器,以 presentationStyleUIModalPresentationPopover 呈现。换句话说,演示文稿是在 iPhone 上推送,在 iPad 上是模态/弹出框。

所以在代码中演示如下:

iPhone:

self.navigationController.pushViewController(detailVC, animated: true)

iPad:


let nc = UINavigationController(rootViewController: detailVC)
nc.modalPresentationStyle = .popover
self.present(nc, animated: true)

我正在重新审视关闭这个视图控制器的代码;它需要在 iPhone 上弹出导航堆栈或在 iPad 上关闭弹出框。

目前代码如下:

        if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone 
            self.navigationController?.popViewController(animated: true)
         else 
            self.presentingViewController?.dismiss(animated: true, completion: nil)
        

但令我震惊的是,几乎可以肯定有一个更简洁的解决方案 - 可能是 API 调用,它在两个平台上针对两种上下文都做正确的事情,而无需根据设备习惯切换行为。

是否有更简洁/非设备特定/更惯用的方式来处理 iPhone 和 iPad 上此视图控制器的解除

我希望并期待 self.presentingViewController?.dismiss() 对这两种情况都有效,但事实并非如此。

我很欣赏演示代码可能需要适应最正确的演示和关闭方法。

【问题讨论】:

【参考方案1】:

我无法猜测以下是否是更简洁的方法,但不是特定于设备的,我打算提供其他方法来做到这一点

当将 UIViewController 呈现为 UINavigationController 的 rootVC 时,您可以检查解除操作

if self.navigationController?.viewControllers.first === self 
    dismiss(animated: true, completion: nil)
 else 
    self.navigationController?.popViewController(animated: true)

或者,您可以针对两种情况执行 2 个操作

@objc func popAction() 
    self.navigationController?.popViewController(animated: true)


@objc func dismissAction() 
    dismiss(animated: true, completion: nil)

【讨论】:

以上是关于在 iPhone 和 iPad 上清除视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

是否有用于在表格视图控制器上编辑字段的 iPhone/iPad 库?

在 iPad 上运行的 iPhone 应用程序中横向视图顶部的 20 像素间隙

videoView 控制器中的摄像机视图适用于 iPhone 但不适用于 iPad

关闭时,横向iPad上带有键盘的模态视图控制器会更改位置[重复]

在 iPad 端口中管理视图控制器

让 UIActivityViewController (share) 以它在 iPhone 上显示的方式在 iPad 上显示?