【问题标题】:How to compare UIViewController in Swift 3?如何比较 Swift 3 中的 UIViewController?
【发布时间】: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)! } .

标签: ios swift uiviewcontroller swift3 uinavigationcontroller


【解决方案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)
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-25
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多