检查视图控制器类是否存在于视图控制器数组中

3

我正在尝试检查self.navigationController.viewControllers中的视图控制器列表。

NSMutableArray *arrayOfControllers = [[NSMutableArray alloc] initWithObjects:self.navigationController.viewControllers, nil];

作为示例,这将返回一个如下的数组:
array -- (
        (
        "<HomeViewController: 0xb1aca10>",
        "<LeftMenuViewController: 0xe751520>"
    )
)

我现在需要检查数组中是否存在HomeViewController,该如何做?

我尝试过使用[arrayOfControllers containsObject:[MESHomeViewController class]]),但这并没有返回true。

4个回答

8

遍历所有视图控制器并检查视图控制器是否为[MESHomeViewController class]。您不需要MESHomeViewController的实例来使用此方法。

for (UIViewController *vc in arrayOfControllers) {
    if ([vc isKindOfClass:[MESHomeViewController class]]) {
        //It exists
    }

这似乎不起作用,即使我知道类在数组中存在,根据问题/日志,exists部分也没有被调用。 - StuartM
通过正确创建初始数组解决了问题 - NSMutableArray *arrayOfControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; - StuartM

1
[arrayOfControllers containsObject:[MESHomeViewController class]]

由于指向控制器的指针在数组中,而不是控制器类名,因此无法工作。

您应该可以简单地执行

[arrayOfControllers containsObject:self] // if inside MESHomeVIewController
[arrayOfControllers containsObject:myHomeViewController] //The instance of MESHomeViewController

编辑:

如果您不想分配类进行检查,可以使用isKindOfClass:检查,或者创建一个包含类名称而不是实际实例的数组。


如果我没有主控制器的实例,那该怎么办?我是否需要分配/初始化来检查它是否存在,这反过来又会在后台创建控制器进行检查...如果是这样,这不是我想做的事情,因为它是一个大VC。 - StuartM
我能想到的两个解决方案是 - 第一个解决方案是使用isKindofClass: 第二个解决方案是使用类而不是对象创建数组。 - Jack
你创建视图控制器数组的方式假设你正在测试的控制器已经被创建并存在于self.navigationController.viewControllers中。此外,如果你需要检查尚不存在的东西的存在,那么你所做的事情似乎有些可疑...不是吗? - Matt

1

containsObject 要求您传递特定实例,而不仅仅是要查找的类的类型。如果您有对特定 MESHomeViewController 的引用,请将其作为参数传递给 containsObject:


1
你比我快了50秒,但是没错。这就是正确的解决方案。 - Jack

0

你可以使用循环并测试 isKindOfClass:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接