什么是showViewController的编程相反:发件人:

我正在写一个仅适用于iOS 8的应用程序,我正在使用“Show”和“Show Detail”segue以及showViewController:sender:showDetailViewController:sender:方法组合的新自适应演示文稿。

我的问题是什么是调用showViewController: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]; } ... 

等等…那么有没有一种通用的方式来反向显示? 如果不是我看到的唯一解决scheme是使用放松塞格斯的一切。 没有太多的麻烦,但我很好奇。

关于showViewController:sender:showDetailViewController:sender:在编程iOS 8:深入观察视图,视图控制器和框架中有一章 。

当这些方法被调用时,他们会调用targetViewControllerForAction:sender:并在返回的对象上调用这个方法。 目标对象可以以适当的方式显示视图控制器。 例如,导航控制器将视图控制器推到其导航堆栈上。

所以你可以创build一个通用的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:方法,如果将始终正确地closures取决于上下文的视图控制器。

这里有一个技巧,我已经使用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或类似的东西为它的工作。 另一个select是检查presentationViewController但是这并不总是保证模态表示。