Может ли viewWillDisappear вызываться напрямую?
Есть ли у кого-нибудь официальная ссылка на вопрос, почему методы, такие как viewWillDisappear, не должны вызываться напрямую? Есть несколько существующих сообщений на эту тему, но нет официальной ссылки, только мнения.
Делать это не имеет смысла, так как он вызывает метод "вне цикла" из управления временем жизни представления. Конечно, они могут быть, и во многих случаях, переопределены.
Эта проблема связана с тем кодом, с которым я столкнулся, когда viewWillDisappear вызывается из какого-либо метода. Это действительно содержимое метода viewWillDisappear, которое необходимо вызвать.
Пример:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// The following two methods are the ones that need to be called below
[self someMethod];
[self anotherMethod];
}
- (void)delegateMethod
{
[self viewWillDisappear:YES];
// Do some other work
// View is moved off-screen, not deallocated, and therefore, does not "disappear"
}
Инстинктивно кажется неправильным вызывать любой из методов иерархии представления напрямую (например, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear). Если вы скажете "себе" и "супер" представлению, что viewWillDisappear появляется, это может сделать что-то в структуре, что может вызвать проблемы в дальнейшем. Я думаю, что эти методы должны вызываться только фреймворком. Однако это мое мнение, а не официальный источник. Заголовочные файлы, кажется, не предоставляют ничего об этом.
Любая помощь приветствуется.
1 ответ
Там нет технической причины, вы не можете.
Но ты не должен.
Это плохая практика кодирования, и вы можете запутать читателя или, что еще хуже, заставить его / ее не доверять вам.
Хорошей практикой кодирования будет следующее:
- (void)delegateMethod
{
[self doCommonWork];
}
- (void)viewWillDisappear:(BOOL)animated
{
[self doCommonWork];
}
- (void)doCommonWork
{
// …
}