是什么与showViewController的编程相反:sender:

时间:2014-09-09 11:00:35

标签: ios uiviewcontroller ios8

我正在编写一个仅限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的一切。没有太多的麻烦,但我很好奇。

2 个答案:

答案 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,但这并不总能保证模态显示。