ios - 清除 iPhone 和 iPad 上的 View Controller

标签 ios swift uiviewcontroller uipopovercontroller

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

在 iPad 上,它是 UINavigationController 中的 Root View Controller ,呈现为 UIModalPresentationPopoverpresentationStyle。换句话说,演示文稿在 iPhone 上是推送,在 iPad 上是模态/弹出。

所以在代码中进行了如下展示:

苹果手机:

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

iPad:


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

我正在重新审视关闭这个 View Controller 的代码;它需要在 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 上此 View Controller 的关闭

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

我明白演示代码可能需要调整以实现最正确的演示和解雇方法。

最佳答案

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

当将 UIViewController 呈现为 UINavigationController 的根 VC 时,您可以检查解雇操作

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)
}

关于ios - 清除 iPhone 和 iPad 上的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55511948/

相关文章:

iphone - 为什么 Xcode 在 iOS 模拟器和设备上运行我的项目的旧版本?

ios - RxSwift - onError 发出两次

ios - 我试图从我的主 ViewController 调用一个函数,并使用它在我的第二个 ViewController 中加载 JSON 数据

iphone - 在另一个 View 上显示 UIViewController/UIView

ios - 为什么 Swift 可选变成零?

objective-c - Xcode:如何访问子类中的方法?

macos - NSOpenPanel 不允许打开应用程序包

swift - 如何使用 RxSwift 和 XCTest 测试进入 Swift 主线程的函数?

ios - 在 iOS 中推送 View Controller 时难以绕过堆栈中的 View Controller

ios - 取 NSString 占位符的 C 函数宏