如何比较Swift 3中的UIViewController?

问题描述:

我想比较的UIViewController在斯威夫特3,但有一些错误如何比较Swift 3中的UIViewController?

extension UINavigationController 
{ 
    func myPopToViewController(viewController:UIViewController, animated:Bool) -> UIViewController? { 
     var arrViewControllers:[UIViewController] = [] 

     arrViewControllers = self.viewControllers 
     for vc:UIViewController in arrViewControllers { 
      if(vc.isKind(of: viewController)) // This Line gives me error 
      { 
       return (self.navigationController?.popToViewController(vc, animated: animated)?.last)! 
      } 

     } 
     return nil 
    } 

} 

/Users/varunnaharia/Documents/Projects/appname/appname/Public/UINavigationController+Extra.swift:18:30 :无法将类型的价值 '的UIViewController' 预期参数类型 'AnyClass'(又名 'AnyObject.Type')

,如果尝试使用

if(vc is viewController) 

它给

/Users/varunnaharia/Documents/Projects/appname/appname/Public/UINavigationController+Extra.swift:18:22:使用未声明的类型 '的viewController'

我通过它调用它

self.navigationController?.popOrPopToViewController(viewController: MyUIViewController(), animated: false) 
+0

工作,如果是VC arrViewControllers {}试试这个 –

+0

请解释它是如何工作的?它是给出相同的错误... –

+0

尝试'如果(vc是UIViewController)' –

如果你想比较一个特定的视图控制器,你必须比较他们的引用。

尝试......

if(vc === viewController)) 
{ 
    return (self.navigationController?.popToViewController(vc, animated: animated)?.last)! 
} 

for viewsController in arrViewControllers 
{ 
    if(viewsController.isKind(of: YourControllerClassName.self)){ 
    } 
} 
+0

完全相同的错误'Users/varunnaharia/Documents/Projects/appname/appname/Public/UINavigationController + Extra.swift:18:30:无法将类型'UIViewController'的值转换为期望的参数类型'AnyClass'(又名'AnyObject.Type ')' –

+0

您是否使用过我提供的确切代码? –

+0

你在哪里得到错误? –

在迅速的,我们用is,而不是isKind(of:)

is用于检查type of the object

所以,你可以使用,

if(vc is UIViewController) 

但我觉得在这里你试图match the 2 references of UIViewController

因此,您需要使用===而不是is。该运算符用于匹配相同类型的2个引用。

if(vc === viewController) 
+0

感谢您的解释 –

你正在寻找可能是什么,是,直到弹出一个给定的控制器,在给定的控制器是当前导航堆栈中的对象的方法。

所以,

这里是弹出一个给定的控制器上面所有控制器的扩展方法。

extension UINavigationController { 
    func popTo(controllerToPop:UIViewController) { 
     let controllers = self.viewControllers 
     for controller in controllers { 
      if(controller == controllerToPop) { 
       self.popTo(controllerToPop: controllerToPop) 
      } 
     } 
    } 
} 

我只是修改先生@BangOperator的移动到特定的视图控制器的答案。

extension UINavigationController { 

func popTo(controllerToPop:UIViewController) { 

    //1. get all View Controllers from Navigation Controller 
    let controllersArray = self.viewControllers 

    //2. check whether that view controller is exist in the Navigation Controller 
    let objContain: Bool = controllersArray.contains(where: { $0 == controllerToPop }) 

    //3. if true then move to that particular controller 
    if objContain { 
     self.popToViewController(controllerToPop, animated: true) 
    } 
    } 
} 

斯威夫特4 希望它会为你

extension UINavigationController { 
    func myPopToViewController(viewController:UIViewController, animated:Bool) { 
    var arrViewControllers:[UIViewController] = [] 
    arrViewControllers = self.viewControllers 
    for vc:UIViewController in arrViewControllers { 
     if(vc.isKind(of: viewController.classForCoder)){ 
     (self.popToViewController(vc, animated: animated)) 
     } 
    } 
    } 

}