viewdidunload не вызывается вообще - PullRequest
7 голосов
/ 08 апреля 2011

Моя проблема такова:

  1. Родительский класс загружает дочернее представление.
  2. Ребенок удаляет себя во время действия, используя «removeFromSuperView».
  3. Родительский класс получает вызов делегата, когда дочерний объект удаляется, и, следовательно, делает дочерний объект нулевым.

Тем не менее viewdidunload дочернего класса не вызывается!

Ответы [ 4 ]

11 голосов
/ 08 апреля 2011

Как уже упоминалось, viewDidUnload - это метод UIViewController.Не гарантировано, что вам позвонят.Он вызывается только в ситуациях нехватки памяти, когда приложение освобождает представление контроллера для освобождения памяти.Это дает вам возможность освободить любое из подпредставлений представления, которые вы, возможно, сохранили в качестве свойств вашего контроллера.

Если вы вызываете removeFromSuperview для представления вашего контроллера представления, то вы, вероятно, используете UIViewController вконтекст, который он не был предназначен для обработки.Контроллеры вида предназначены для управления полноэкранными видами.Ожидается, что эти представления будут представлены в iPhone всего лишь в нескольких контекстах:

  1. В качестве полноэкранного вида контроллера корневого представления окна
  2. В полноэкранном режиме виерархия экранов, управляемых UINavigationController
  3. как полноэкранное представление, представленное на вкладке
  4. как полноэкранное представление, представленное с использованием presentModalViewController: animated:

как долготак как вы используете контроллер представления в этих контекстах (плюс пару других контекстов на iPad), то вы можете надежно управлять жизненным циклом своего представления с помощью loadView, viewDidLoad, viewWillAppear: animated :, viewDidAppear: animated :, viewWillDisappear: animated:, и viewDidDisappear: animated :, и методы viewDidUnload (опять же, имея в виду, что viewDidUnload вызывается не всегда).

Единственный раз, когда вы обычно передаете представление контроллера представления в addSubview: это когда выдобавьте вид вашего корневого контроллера в окно.Если вы хотите попытаться использовать вложенный контроллер представления для управления неполноэкранным подпредставлением, вам нужно будет вручную вызвать его методы viewWill / DidAppear / Disappear: animated: и viewDidUnload в соответствующее время из контроллера вашего полноэкранного представления.

3 голосов
/ 08 апреля 2011

viewDidUnload вызывается, когда UIViewControllers 'view выгружается, а не когда удаляется подпредставление из view.

0 голосов
/ 09 сентября 2011

Дополнительным примечанием является то, что viewDidUnload может быть не выполнен перед dealloc. Это происходит, когда счетчик ссылок UIViewController достигает 0.

Как говорит шаблон Xcode:

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
0 голосов
/ 08 апреля 2011

viewdidunload - это метод UIViewController.Если вы используете подкласс UIViewController для создания объекта, и представление этого объекта удаляется из суперпредставления, тогда вызывается viewdidunload.Убедитесь, что ваш дочерний вид сделан из UIViewController.

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