#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, это очень просто, потому что у вас есть ссылка на него.