如何获取UINavigationController的rootViewController

29

我想要获取 UINavigationController 的 rootViewController。在 Objective-C 中可以这样实现,但是在 Swift 中使用会报错。

代码截图 1

如果我添加 as! NSArray,虽然能够工作,但是也提示了一个错误:“cast from '[UIViewController]' to unrelated type 'NSArray' always fails”。

代码截图 2

有没有更好的方法来获取 `rootViewController`,并解决这个错误呢?谢谢。


这是 let homevci = navigationController!.viewControllers!.first as! NBHomeVC - Igor Bidiniuc
但更好的方法是,你需要阅读一些 Swift 文档。这跟 Objective-C 不太一样 :) - Igor Bidiniuc
https://dev59.com/_V8d5IYBdhLWcg3wkS7Y - Scriptable
1
它可以工作,谢谢你。我认为我应该考虑一下[UIViewController]和数组之间的区别。 - Remsay
https://dev59.com/bXI-5IYBdhLWcg3wj5JG#64256611 - AechoLiu
4个回答

51

您可以通过以下方式获取root权限:

self.navigationController!.viewControllers.first

21

或者作为扩展:

extension UINavigationController {
    var rootViewController : UIViewController? {
        return viewControllers.first
    }
}

然后你可以像这样使用它:

if let rootv = navigationController?.rootViewController { }

不错的回答,但是 as? UIViewController 可以被移除,因为 first 已经返回了一个 UIViewController?。另外,在你的第二个代码片段中,应该是 navigationController?.rootViewController,因为它是可选的。 - nyg
@nyg:感谢您发现了这个问题,我敢肯定它在过去的Swift版本中曾经运行过,但是Swift版本更替太多了...现在应该可以在Swift 4中正常工作。 - Bogdan Farca

4
也许这可以被使用。
self.navigationController.visibleViewController

或者

self.navigationController.topViewController

2
这不是根视图控制器,而是导航控制器堆栈中的顶部视图控制器。如果导航控制器没有推送任何视图控制器,topViewController 将成为根视图控制器。 - mazen

0

替换

let homevci = controllerArray.objectAtIndex(0) as? NBHomeVC

使用

let homevci = controllerArray.first as? NBHomeVC

或者

let homevci = controllerArray[0] as? NBHomeVC

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