2011-04-26 88 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)該控制器,只要您需要在其他控制器中使用它,通過應用程序委託,做一些像呈現爲模態視圖的東西。 如果您想在應用程序委託中對其執行某些操作,例如清除密碼,這很容易,因爲你有它的參考。