如何比较 Swift 3 中的 UIViewController?

Posted

技术标签:

【中文标题】如何比较 Swift 3 中的 UIViewController?【英文标题】:How to compare UIViewController in Swift 3? 【发布时间】:2017-03-06 11:49:32 【问题描述】:

我正在尝试与 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)

【问题讨论】:

如果 vc 是 arrViewControllers 试试这个 请解释一下它是如何工作的?它给出了同样的错误...... 试试if (vc is UIViewController) if vc is UIViewController //vc 是类类型 UIViewController 试试这个它会为你工作 if(vc.isKind(of: viewController.classForCoder) ) return (self.popToViewController(vc, animated: animated)?.last)! . 【参考方案1】:
for viewsController in arrViewControllers

    if(viewsController.isKind(of: YourControllerClassName.self))
    

【讨论】:

完全相同的错误Users/varunnaharia/Documents/Projects/appname/appname/Public/UINavigationController+Extra.swift:18:30: Cannot convert value of type 'UIViewController' to expected argument type 'AnyClass' (aka 'AnyObject.Type')【参考方案2】:

斯威夫特 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))
      
    
  


【讨论】:

【参考方案3】:

在swift中,我们使用is而不是isKind(of:)

is 用于检查type of the object

所以你可以使用,

if(vc is UIViewController)

但我认为你在这里尝试match the 2 references of UIViewController

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

if(vc === viewController)

【讨论】:

感谢您的解释【参考方案4】:

如果您想与特定的视图控制器进行比较,则必须比较它们的引用。

试试这个...

if(vc === viewController) )

    return (self.navigationController?.popToViewController(vc, animated: animated)?.last)!

【讨论】:

【参考方案5】:

我只是修改了@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)
    
  

【讨论】:

以上是关于如何比较 Swift 3 中的 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较Swift 3.2中的两个日期?

如何在Swift 4中添加两个Int? [重复]

如何在Swift中设置UIWebView的“User-Agent”标头

如何在 Swift 中正确实现不同视图控制器之间的协议和委托?

Swift Codable:标记对象以进行状态恢复

如何比较Swift中的两个词典?