2011-04-26 87 views
0

我有一个取得密码的模态视图控制器。由于我不希望在我的应用程序中断时将密码写入磁盘,因此我想在applicationWillResignActive上输入密码。 (对于那些可能发表评论的人,我知道安全文本字段没有正确归零)。iPhone:如何枚举视图控制器?

我试过下面的代码,我的视图控制器永远不会被找到。对于第一组代码(UIView),我相信它是因为我混合并匹配视图和视图控制器。我不确定为什么第二组代码(UIViewController)不能工作,因为有几个人已经提出了它。

如何枚举视图控制器并找到感兴趣的控制器?我只是想发送clearPassworAndPinPasswordPromptController如果存在(因为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]; 
    } 
} 

回答

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

希望它能帮助。

+0

我修改了'UIViewController'下显示的代码 - 没有喜悦。 clearPasswords方法被调用,并且控制器似乎被枚举。但没有匹配。是的苹果 - 我认为他们向后弯曲,使他们的狗屎不安全。如果([viewController isKindOfClass:passwordPromptClass]) [viewController clearPassworAndPin];如果(视图控制器是KindOfClass:passwordPromptClass) – jww 2011-04-26 04:45:29

+0

' for(UIViewController * viewController in viewsControllers) { }这不够吗 – visakh7 2011-04-26 04:55:59

+0

不幸的是,代码是不够的。它显示了5个视图控制器,它们与标签栏中的5个视图相对应。模式提供的PasswordPrompt不在控制器列表中。 – jww 2011-04-26 05:16:51

1

点在哪里你目前的PasswordPromptController作为modalViewController你能不能将其存储为一个实例变量?然后,在你的applicationWillResignActive:回调函数中,你将得到一个VC来处理消息的句柄。

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

1

你将不得不通过导航堆栈获取控制器。

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

@property(nonatomic, copy) NSArray *viewControllers 
+0

我相信你的建议类似于7KV7。我一直在评论7KV7,所以我不会打扰你的重复。 – jww 2011-04-26 05:18:07

+0

@noloader:我是科德兹后的第二个人,他发布了答案,请检查时间... – Jhaliya 2011-04-26 05:38:13

0

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

如果您发现通过枚举视图控制器找到PasswordPromptController并不容易,那么只需在您的应用程序委托中声明(alloc/init)该控制器,只要您需要在其他控制器中使用它,通过应用程序委托,做一些像呈现为模态视图的东西。 如果您想在应用程序委托中对其执行某些操作,例如清除密码,这很容易,因为你有它的参考。