如何在iPhone上枚举视图控制器?

时间:2011-04-26 03:40:21

标签: iphone uiviewcontroller

我有一个提取密码的模态视图控制器。如果我的应用程序被中断,我不想将密码写入磁盘,我想在applicationWillResignActive上取消密码。 (对于那些可能发表评论的人,我知道安全文本字段没有正确归零)。

我尝试过以下代码,我的视图控制器永远不会找到。对于第一组代码(UIView),我相信它,因为我正在混合和匹配视图和视图控制器。我不知道为什么第二组代码(UIViewController)无法正常工作,因为有几个人建议它。

如何枚举视图控制器并找到感兴趣的控制器?我只想将clearPassworAndPin发送到PasswordPromptController(如果存在)(因为当视图消失时,并不总是发送viewWillDisappear)。


修改后的7KV7和Jhaliya答案如下(有效)。使用viewController.modalViewController的'if'语句执行了5次(在选项卡视图中为每个控制器执行一次)。因此,感兴趣的单模态控制器被发送了clearPasswords消息5次。

for (UIViewController * viewController in viewsControllers)
{
    if ([viewController isKindOfClass:passwordPromptClass])
    {
        [(PasswordPromptController *)viewController clearPassworAndPin];
    }
    else
    {
        if(viewController.modalViewController)
            [self clearPasswords:[NSArray arrayWithObjects:viewController.modalViewController, nil]];
    }
}

使用UIViews(没有快乐)

- (void)applicationWillResignActive:(UIApplication *)application
{
  if(application.windows != nil)
    [self clearPasswords:application.windows];
}

- (void)clearPasswords:(NSArray *)subviews
{
  Class passwordPromptClass = [PasswordPromptController class];

  for (UIView * subview in subviews)
  {
    if ([subview isKindOfClass:passwordPromptClass])
      [(PasswordPromptController *)subview clearPassworAndPin];
  }
}

使用UIViewController(没有欢乐)

- (void)applicationWillResignActive:(UIApplication *)application
{
  if(tabBarController.viewControllers != nil)
    [self clearPasswords:tabBarController.viewControllers];
}

- (void)clearPasswords:(NSArray *)viewsControllers
{
  Class passwordPromptClass = [PasswordPromptController class];

  for (UIViewController * viewController in viewsControllers)
  {
    if ([viewController isKindOfClass:passwordPromptClass])
      [(PasswordPromptController *)viewController clearPassworAndPin];
  }
}

4 个答案:

答案 0 :(得分:1)

在您将PasswordPromptController呈现为modalViewController时,您是否可以将其存储为实例变量?然后,在您的applicationWillResignActive:callback中,您将获得要发送消息的VC句柄。

请务必在解除对PasswordPromptController引用的引用时释放并取消它。

答案 1 :(得分:1)

您必须通过导航堆栈才能获得控制器。

使用以下UINavgationController方法获取导航堆栈中的所有viewController

@property(nonatomic, copy) NSArray *viewControllers

答案 2 :(得分:1)

NSArray *array = [self.navigationController viewControllers];
yourViewController = [array objectAtIndex:yourChoiceOfIndex];

希望它有所帮助。

答案 3 :(得分:0)

嗯...,我不得不说我喜欢提供其他建议/解决方案,因为很多人都试图专门回答你的问题。

如果您发现通过枚举视图控制器找到PasswordPromptController并不容易,您只需在应用程序委托中声明(alloc / init)该控制器,无论何时需要在其他控制器中使用它,通过app delegate获取它,做一些像模态视图一样的东西。 如果您想在应用代理中对其执行某些操作,例如清除pwd,它非常简单,因为你可以参考它。