UIViewController viewDidAppear - потому что он был выдвинут или потому что подпредставление было вытолкнуто? - PullRequest
6 голосов
/ 21 декабря 2011

В моем приложении у меня есть около дюжины различных контроллеров представления, помещенных в стек или извлеченных из них в разных порядках. Когда появилось представление (я использую метод viewDidAppear), мне нужно определить, происходит ли это потому, что это представление было только что помещено в стек или потому что одно из его подпредставлений было извлечено из стека.

Я прошел через этот вопрос: viewWillDisappear: определить, выталкивается ли контроллер вида или показывает контроллер подвидом

Но я не думаю, что это мне очень помогает. Любые предложения, пожалуйста?

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

Лучшее решение, если вы можете управлять им, - это попытаться пересмотреть ваш код, чтобы не имело значения, был ли контроллер просто выдвинут или его дочерний элемент был просто вытолкнут. По сути, контроллер представления является посредником между его представлением и данными, с которыми работает приложение. Пока эти данные актуальны, контроллеру не следует беспокоиться о том, что происходило до появления его представления. Задачи, которые в настоящее время выполняет ваш контроллер на основе предыдущего состояния приложения, например обновление данных, могут действительно лучше располагаться в другом классе.

Другая возможность, если вы используете раскадровки, это полагаться на -prepareForSegue:sender: вместо -viewDidAppear. Последовательность, которую вы передаете в этом методе, имеет свойства, которые идентифицируют контроллеры представления источника и назначения, и обычно этой информации достаточно, чтобы рассказать вам, как ваш контроллер стал текущим.

Если ни один из них не работает в вашем случае, рассмотрите возможность переноса кода конфигурации одним или несколькими различными способами. Корень проблемы, с которой вы сталкиваетесь, в том, что -viewWillAppear действительно не означает, что вам нужно. Создайте метод, который действительно означает то, что вам нужно, например -childControllerFinished, и используйте , что , чтобы выполнить настройку, необходимую вам.

1 голос
/ 21 декабря 2011

То, что вы могли бы сделать, это иметь свойство BOOL на вашем контроллере представления, называемое уже выдвинутым или что-то подобное.Затем в вашем методе viewDidAppear проверьте, является ли оно ложным (что будет первый раз, когда вызывается viewDidAppear), если для него установлено значение true.

Затем, когда извлекается представление viewController для подпредставления, метод viewDidAppear проверит, установлено ли для свойстваreadyPressed значение true, если вы знаете, что подпредставление только что извлечено.

0 голосов
/ 21 декабря 2011

Если контроллер представления помещен в стек, будет вызван его метод viewDidLoad; если его субконтроллер отключен, то viewDidLoad НЕ вызывается.

- (void)viewDidLoad {
    [super viewDidLoad];
    //do any setup you want to do only when the view is pushed onto the
    //stack for the first time; this method will not be called
    //when the view's subview is popped and this one becomes visible
}

Итак, используйте viewDidLoad (или initWithNibName, в зависимости от того, что вы делаете) для однократной настройки, когда контроллер вида нажимается впервые, и viewDidAppear для настройки, которую вы хотите выполнить. каждый раз, когда появляется вид. С UINavigationController вы можете реализовать эти два метода в протоколе UINavigationControllerDelegate:

- (void)navigationController:(UINavigationController *)navigationController 
    willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [viewController viewWillAppear:animated];
    //do any every-time setup *before* the view is shown
}

- (void)navigationController:(UINavigationController *)navigationController 
    didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [viewController viewDidAppear:animated];
    //do any every-time setup *after* the view is shown
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...