Как перечислить контроллеры просмотра на iPhone?

#iphone #uiviewcontroller

#iPhone #uiviewcontroller

Вопрос:

У меня есть модальный контроллер просмотра, который извлекает пароль. Поскольку я не хочу, чтобы пароль записывался на диск, если мое приложение прерывается, я хочу сохранить пароль на applicationWillResignActive . (Для тех, кто может прокомментировать, я знаю, что защищенное текстовое поле не обнуляется должным образом).

Я пробовал следующий код, и мой контроллер просмотра так и не найден. Что касается первого набора кода (UIView), я полагаю, это потому, что я смешиваю и сопоставляю представления и контроллеры представлений. Я не уверен, почему второй набор кода (UIViewController) не работает, поскольку несколько человек предложили это.

Как перечислить контроллеры просмотра и найти интересующий контроллер? Я просто хочу отправить clearPassworAndPin в PasswordPromptController , если присутствует (поскольку viewWillDisappear не всегда отправляется, когда представление исчезает).


Ниже приведен модифицированный ответ 7KV7 и Jhaliya (это сработало). Инструкция ‘if’ с использованием viewController.modalViewController была выполнена 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];
  }
}
  

Ответ №1:

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

Надеюсь, это поможет.

Комментарии:

1. Я изменил код, как показано в разделе «UIViewController» — никакой радости. clearPasswords Вызывается метод, и контроллеры, по-видимому, перечислены. Но нет совпадения. Да, Apple — я думаю, они перегибают палку назад, чтобы сделать свое дерьмо небезопасным.

2. for (UIViewController * viewController in viewsControllers) { if ([viewController isKindOfClass:passwordPromptClass]) [viewController clearPassworAndPin]; } Разве этого недостаточно

3. К сожалению, кода недостаточно. Похоже, что найденные 5 контроллеров просмотра соответствуют 5 представлениям на панели вкладок. PasswordPrompt, который представлен модально, отсутствует в списке контроллеров.

4. Тогда как `if ([ViewController isKindOfClass:passwordPromptClass])’ возвращает true

5. [viewController isKindOfClass:passwordPromptClass] никогда не возвращался YES , поэтому пароль был записан на диск, когда приложение было отправлено в фоновом режиме.

Ответ №2:

В тот момент, когда вы представляете PasswordPromptController как modalViewController, не могли бы вы сохранить его как переменную экземпляра? Затем в вашем applicationWillResignActive: обратный вызов у вас будет дескриптор VC для отправки сообщения.

Обязательно освободите и обнулите свою ссылку на ссылку PasswordPromptController, когда она будет отклонена.

Ответ №3:

вам придется пройти через стек навигации, чтобы получить контроллеры.

Используйте UINavgationController приведенный ниже метод, чтобы получить все viewController в вашем навигационном стеке.

 @property(nonatomic, copy) NSArray *viewControllers
  

Комментарии:

1. Я полагаю, что ваше предложение было похоже на 7KV7. Я комментировал 7KV7, поэтому не буду беспокоить вас дублированием.

2. @noloader : Я был вторым после Codz, кто опубликовал ответ, пожалуйста, проверьте время …

Ответ №4:

хм …, я должен сказать, что мне нравится давать альтернативные предложения / решения, поскольку многие люди пытались конкретно ответить на ваш вопрос.

Если вы обнаружили, что нелегко найти PasswordPromptController, перечисляя контроллеры просмотра, вы можете просто объявить (alloc / init) этот контроллер в делегате вашего приложения, всякий раз, когда вам нужно использовать его в других контроллерах, получить его через делегат приложения, сделать что-то вроде представления в виде модального представления. Когда вы хотите что-то сделать против этого в своем делегате приложения, например, очистить pwd, это очень просто, потому что у вас есть ссылка на него.