我正在编写一个仅限iOS 8的应用程序,我正在使用新的自适应演示文稿,结合使用“显示”和“显示详细信息”segue以及showViewController:sender:
和showDetailViewController:sender:
方法。
我的问题是,在致电showViewController:sender:
后回去的程序方式是什么?视图控制器的显示方式取决于其父上下文。例如。在UINavigationController
showViewController:sender:
中将新控制器推送到导航堆栈,但如果视图控制器图中没有UIKit容器,则showViewController:sender:
最终会进行演示。
考虑到我可以编写自己的任意容器控制器,检查
似乎是不可行的if (self.navigationController) {
[self.navigationController popViewControllerAnimated:YES];
}
else if (self.presentingViewController){
...
else if ([self.parentViewController isKindOfClass:[CrazyCustomContainer class]]){
[self.parentViewController someWackyUnwindMethod];
}
...
等等......那么是否存在反向显示的通用方法?如果不是我看到的唯一解决方案是使用展开segue的一切。没有太多的麻烦,但我很好奇。
答案 0 :(得分:25)
有一章介绍了showViewController:sender:
和showDetailViewController:sender:
在Programming iOS 8: Dive Deep into Views, View Controllers, and Frameworks中的工作原理。
当调用这些方法时,它们会自己调用targetViewControllerForAction:sender:
并在返回的对象上调用此方法。然后,目标对象可以以适当的方式显示视图控制器。例如,导航控制器将视图控制器推送到其导航堆栈上。
因此,您可以创建一个通用的dismissVC:
方法,并在不同的UIViewController
子类中覆盖它。
extension UIViewController {
func dismissVC(sender:AnyObject?) {
if let presentingVC = targetViewControllerForAction("dismissVC", withSender: sender) as? UIViewController {
presentingVC.dismissVC(self)
}
}
}
extension UINavigationController {
override func dismissVC(sender: AnyObject?) {
popViewControllerAnimated(true)
}
}
extension CrazyCustomContainer {
override func dismissVC(sender: AnyObject?) {
someWackyUnwindMethod()
}
}
这样,当你调用dismissVC:
方法时,if将始终根据上下文正确地关闭视图控制器。
答案 1 :(得分:0)
这是我在showViewController存在之前使用的一个技巧,可能会有所帮助。
if let nav = navigationController {
// We have a navigation controller so we'll have a back button
}
else {
// no navigation controller, need a cancel button
// ... Add Cancel Button
}
基本上你会检查你所处的位置。然后,您可以将任何保存代码放在viewDidDisappear
或类似的东西中,因为它适用于两者。另一个选择是检查presentationViewController
,但这并不总能保证模态显示。