Как перечислить контроллеры представления на iPhone? - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть модальный контроллер вида, который выбирает пароль. Поскольку я не хочу, чтобы пароль записывался на диск, если мое приложение было прервано, я хочу узнать пароль на 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];
  }
}

Ответы [ 4 ]

1 голос
/ 26 апреля 2011

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

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

@property(nonatomic, copy) NSArray *viewControllers
1 голос
/ 26 апреля 2011
NSArray *array = [self.navigationController viewControllers];
yourViewController = [array objectAtIndex:yourChoiceOfIndex];

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

1 голос
/ 26 апреля 2011

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

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

0 голосов
/ 26 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...