iPhone和iPad上的Clean View Controller解雇

时间:2019-04-04 09:06:11

标签: ios swift uiviewcontroller uipopovercontroller

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

在iPad上,它是UINavigationController中的根视图控制器,带有presentationStyle中的UIModalPresentationPopover。换句话说,演示是在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 个答案:

答案 0 :(得分: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)
}