如何比较 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中设置UIWebView的“User-Agent”标头