在 iPhone 和 iPad 上清除视图控制器
Posted
技术标签:
【中文标题】在 iPhone 和 iPad 上清除视图控制器【英文标题】:Clean view controller dismissal on iPhone & iPad 【发布时间】:2019-04-04 09:06:11 【问题描述】:我有一个用于编辑对象细节的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】:我无法猜测以下是否是更简洁的方法,但不是特定于设备的,我打算提供其他方法来做到这一点
当将 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上带有键盘的模态视图控制器会更改位置[重复]
让 UIActivityViewController (share) 以它在 iPhone 上显示的方式在 iPad 上显示?