【问题标题】:Compare two viewControllers swift快速比较两个 viewController
【发布时间】:2018-08-07 23:25:46
【问题描述】:
我需要比较两个视图是否相同,我得到这样的视图
let viewController = navController.viewControllers[navController.viewControllers.count - 2]
let newController = self.storyboard!.instantiateViewController(withIdentifier: "Reservar")
当我打印变量的值时,我得到了这个
<Resto.ReservaViewController: 0x7fc9f0e4a860>
<Resto.ReservaViewController: 0x7fc9f0d074a0>
它们是相同的 ViewController,但最后的数字不同,所以我认为这就是 if (viewController == newController) 为 false 的原因
【问题讨论】:
标签:
iphone
swift
viewcontroller
【解决方案1】:
要比较两个视图控制器的Type 吗?
print(type(of: viewController) == type(of: newController))
【解决方案2】:
使用您的代码:
let viewController = navController.viewControllers[navController.viewControllers.count - 2]
let newController = self.storyboard!.instantiateViewController(withIdentifier: "Reservar")
您可以完全确定这两个视图控制器不是同一个对象。它们可能是也可能不是同一类型的视图控制器(同一类),但函数 instantiateViewController() always 创建了一个全新的、在此之前从未存在过的唯一实例视图控制器。它可能与另一个实例是同卵双胞胎,具有所有相同的设置,但它仍然是一个独特的对象。
告诉我们更多关于你想要做什么的信息。您是否正在查看来自导航控制器的对象是否是您期望的类型?
然后你可以使用这样的代码:
let viewController = navController.viewControllers[navController.viewControllers.count - 2]
if viewController is ReservaViewController {
//code to operate on that type
} else {
//Code for other types of view controller
}
或者
if let viewController = navController.viewControllers[navController.viewControllers.count - 2] as? ReservaViewController {
//Code to operate on a ReservaViewController
} else {
//Code to deal with a view controller that's NOT a ReservaViewController
}
编辑:
表达式navController.viewControllers[navController.viewControllers.count - 2] 在没有范围检查的情况下是危险的。如果导航控制器仅包含 1 个视图控制器,则会因索引超出范围错误而崩溃。
【解决方案3】:
两把椅子都是椅子,但它们仍然不是同一把椅子。
类和对象也是如此。
假设您的视图控制器是 ViewController 类的一个实例。那么你想知道的是viewController is ViewController。就像问“这是一把椅子吗?”