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



我有一个获取密码的模式视图控制器。由于如果我的应用程序中断,我不希望密码写入磁盘,所以我想在applicationWillResignActive上查找密码。(对于那些可能发表评论的人,我知道安全文本字段没有正确地归零(。

我已经尝试了以下代码,但我的视图控制器从未找到。对于第一组代码(UIView(,我相信这是因为我正在混合和匹配视图和视图控制器。我不知道为什么第二组代码(UIViewController(不起作用,因为有一些人建议使用它

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


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

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];
  }
}
NSArray *array = [self.navigationController viewControllers];
yourViewController = [array objectAtIndex:yourChoiceOfIndex];

希望能有所帮助。

当您将PasswordPromptController作为modalViewController呈现时,您是否可以将其存储为实例变量?然后,在你的应用程序WillResignActive:回调中,你将有一个VC的句柄来发送消息。

当PasswordPromptController引用被驳回时,请确保释放并取消对它的引用。

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

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

@property(nonatomic, copy) NSArray *viewControllers

hmm。。。,我不得不说,我喜欢给出其他建议/解决方案,因为很多人都试图具体回答你的问题。

如果你发现通过枚举视图控制器不容易找到PasswordPromptController,你可以在你的应用程序委托中声明(alloc/init(该控制器,无论何时你需要在其他控制器中使用它,都可以通过应用程序委托获得它,做一些类似于以模式视图的形式呈现的事情。当你想在你的应用程序委托中对它做一些事情时,例如清除pwd,这非常容易,因为你有它的引用。

最新更新