我有一个提取密码的模态视图控制器。如果我的应用程序被中断,我不想将密码写入磁盘,我想在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];
}
}
答案 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,它非常简单,因为你可以参考它。