如何获取呈现UINavigationController的UIViewController

3

I have

NAVIGATIONController A -> ViewController A -> ViewController B
                                                  |
                                                  | (modal)
                                                  | 
                                                 \ /
                                                  '
                                         NAVIGATIONController B -> ViewController C

我该如何从控制器C返回到控制器A?

当我在控制器C时,我尝试打印不同控制器的值:

print(self.navigationController) //NAVIGATIONController B
print(self.navigationController?.presentingViewController) //UINavigationController (not sure what this is? It is not one of my classes)
print(self.navigationController?.presentedViewController) //nil
print(self.presentingViewController) //The same UINavigationController (still not sure...)
print(self.presentedViewController) //nil

我知道如何从MyViewController C返回到MyViewController B,使用这行代码self.navigationController?.dismissViewControllerAnimated(true, nil),但我想要从C返回到A :-)

我怎么才能访问NAVIGATIONController B之前的内容呢?


如果你想从一个视图控制器返回到之前显示的视图控制器,请考虑使用“取消segue” - 这样你就不必将你的演示层次结构的知识编码到ViewController C中。 - Martin Ullrich
这是仅支持iOS9的版本,我需要支持iOS8的版本。 - Kalzem
我该如何从控制器C使用popToView?我只能dismiss到控制器B,但是我无法控制返回A(所有这些都来自C)。我不想在B上创建一个标志,当呈现NavController B(和视图C)时将其设置为true,并在viewDidAppear上检查标志是否被激活... 这看起来不太干净。 - Kalzem
在 ViewController B 中解散 ViewController C,并在完成后弹出 ViewController B。 - Surya Subenthiran
这实际上就是我的问题...我该如何访问导航 B 之前的内容?我的所有 print 要么显示导航 B,要么为空。 - Kalzem
1
@BabyAzerty取消segue是在iOS 6中引入的。只有一些较新的API是iOS 9特定的。 - Martin Ullrich
3个回答

4
UINavigationController来自于self.navigationController?.presentingViewController,应该是你的“NAVIGATIONController A”。
从C中你应该可以通过self.navigationController?.presentingViewController获取“NAVIGATIONController A”,并调用popToRootViewController(不要有动画)。
然后使用self.navigationController?.dismissViewControllerAnimated(true, nil)关闭“ViewController C”(及其导航控制器)。
这样,当“ViewController C”被关闭时,顶层导航控制器将已经显示“ViewController A”。

1
谢谢!它完美地运行 :) 这是我的完整代码: (self.navigationController?.presentingViewController as! UINavigationController).popToRootViewControllerAnimated(false)self.navigationController?.dismissViewControllerAnimated(true, completion: nil) - Kalzem
非常好的回答!感谢您发布您实现的答案。 - Naishta

1
在BScene的viewDidLoad方法中:
override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.noti), name: "popAndDismiss", object: nil)
}
func noti() {
        navigationController?.popViewControllerAnimated(true)
    }

在CScene的buttonAction函数中:
@IBAction func click(sender: AnyObject) {
    NSNotificationCenter.defaultCenter().postNotificationName("popAndDismiss", object: nil, userInfo: nil)
    navigationController?.dismissViewControllerAnimated(true, completion: nil)
}

0

你可以使用popToViewController方法。

[self.navigationController popToViewController:yourviewcontroller animated:YES];

这将弹出视图控制器,直到达到yourviewcontroller。 希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接