2017-01-04 1 views
6

Je veux obtenir le rootViewController de UINavigationController, Cela fonctionne dans Objective-c, mais quand je l'utilise dans Swift, l'erreur me rappelle que c'était faux enter image description here. Si je fais cela, ajoutez "as! NSArray", cela fonctionne, mais cela me rappelle aussi que "cast from '[UIViewController]' au type non lié 'NSArray' échoue toujours". Est-ce que quelqu'un peut montrer un meilleur moyen d'obtenir le rootViewController sans erreur ou rappelle-t-il? Je vous remercie.Comment puis-je obtenir le rootViewController de UINavigationController dans Swift

+0

c'est 'laissez homevci = navigationController! .viewControllers! .premier comme! NBHomeVC' –

+0

mais mieux, vous avez besoin de lire une documentation rapide. ce n'est pas objc-c :) –

+0

http://stackoverflow.com/questions/26667009/get-top-most-uiviewcontroller – Scriptable

Répondre

10

Vous pouvez obtenir la racine par,

self.navigationController!.viewControllers.first 
0

remplacer

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

avec

let homevci = controllerArray.first as? NBHomeVC 

ou

let homevci = controllerArray[0] as? NBHomeVC 
9

Ou comme une extension:

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

Et vous l'utilisez comme ceci:

if let rootv = navigationController?.rootViewController { } 
+0

Belle réponse, mais «comme? UIViewController' peut être supprimé car 'first' renvoie déjà' UIViewController? '. En outre, dans votre second extrait de code, il devrait être 'navigationController? .rootViewController' car c'est un optionnel. – nyg

+0

@nyg: Merci de l'avoir remarqué, je suis sûr que cela a fonctionné à un moment donné dans le passé, mais trop de versions de Swift allaient et venaient ... Cela devrait fonctionner maintenant dans Swift 4. –

0

Ou peut-être cela peut être utilisé

self.navigationController.visibleViewController 

ou

self.navigationController.topViewController