Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何获取UINavigationController的rootViewController_Ios_Swift_Rootviewcontroller - Fatal编程技术网

Ios 如何获取UINavigationController的rootViewController

Ios 如何获取UINavigationController的rootViewController,ios,swift,rootviewcontroller,Ios,Swift,Rootviewcontroller,我想获取UINavigationController的rootViewController。它在Objective-c中工作,但当我在Swift中使用它时,错误提醒我它是错误的 如果我这样做,添加as!NSArray,它可以工作,但也提醒我“从“[UIViewController]”转换到不相关类型“NSArray”总是失败的” 有没有人能提供一种更好的方法来无误地获取“rootViewController”。谢谢。你可以通过 self.navigationController!.viewC

我想获取UINavigationController的rootViewController。它在Objective-c中工作,但当我在Swift中使用它时,错误提醒我它是错误的

如果我这样做,添加
as!NSArray
,它可以工作,但也提醒我“从“[UIViewController]”转换到不相关类型“NSArray”总是失败的”


有没有人能提供一种更好的方法来无误地获取“rootViewController”。谢谢。

你可以通过

self.navigationController!.viewControllers.first
替换

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

或作为扩展:

extension UINavigationController {
    var rootViewController : UIViewController? {
        return viewControllers.first
    }
}
然后你像这样使用它:

if let rootv = navigationController?.rootViewController { }

或者可以用这个

self.navigationController.visibleViewController


这是
让homevci=navigationController!。视图控制器!。第一个!NBHomeVC
但更好的方法是,您需要阅读一些swift文档。它不是objc-c:)它是有效的,谢谢,我想我应该考虑一下[UIViewController]和数组之间的区别。回答不错,但是
as?UIViewController
可以删除,因为
first
已返回
UIViewController?
。另外,在您的第二个代码段中,它应该是
navigationController?.rootViewController
,因为它是可选的。@nyg:感谢您发现它,我相信它在过去的某个时候起了作用,但是有太多的Swift版本来了又去了。。。它现在应该可以在Swift 4中工作。这不是根视图控制器,这是导航控制器堆栈中的顶视图控制器,
topViewController
将是根视图控制器,如果导航控制器没有推送任何视图控制器。
if let rootv = navigationController?.rootViewController { }
self.navigationController.visibleViewController
self.navigationController.topViewController