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

jac*_*ash 35 uiviewcontroller ios 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];
}
...
Run Code Online (Sandbox Code Playgroud)

等等...那么有一种反向显示的通用方法吗?如果不是我看到的唯一解决方案是使用展开segue的一切.没有太多的麻烦,但我很好奇.

bzz*_*bzz 27

对于如何一章showViewController:sender:showDetailViewController:sender:工作程序的iOS 8:下潜深为视图,视图控制器和框架.

调用这些方法时,它们会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()
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,当您调用dismissVC:method时,if将始终根据上下文正确地关闭视图控制器.

  • 因此,基于此,问题的实际答案是"是否存在与`showViewController:sender:`?相反的程序性".没有**.您必须使用Apple用于执行自适应演示的相同底层机制有效地实现您自己的通用版本. (12认同)