#iphone #ipad #view
#iPhone #iPad #Вид
Вопрос:
Моя проблема заключается в следующем:
- Родительский класс загружает дочерний вид.
- Дочерний элемент удаляет себя во время действия с помощью «removeFromSuperview».
- Родительский класс получает вызов делегата при удалении дочернего объекта и, следовательно, превращает дочерний объект в nil.
По-прежнему viewdidunload дочернего класса не вызывается!
Комментарии:
1. Этот вопрос следует удалить. viewDidUnload устарел и больше не вызывается в iOS 6.
2. Да, но не все разрабатывают исключительно для iOS 6, поэтому мы должны в лучшем случае отметить, что это устарело и, следовательно, неприменимо к iOS 6, но продолжаем считать это допустимым вопросом и ответом для тех, кто разрабатывает для других версий iOS.
Ответ №1:
Как упоминали другие, viewDidUnload — это метод UIViewController. Его вызов не гарантируется. Он вызывается только в ситуациях с нехваткой памяти, когда приложение освобождает представление контроллера, чтобы освободить память. Это дает вам возможность освободить любое из вложенных представлений view, которые вы, возможно, сохранили как свойства вашего контроллера.
Если вы вызываете removeFromSuperview в представлении вашего контроллера просмотра, то вы, вероятно, используете UIViewController в контексте, для обработки которого он не был предназначен. Контроллеры просмотра предназначены для управления полноэкранными представлениями. Ожидается, что эти представления будут представлены всего в нескольких контекстах на iPhone:
- Как полноэкранный режим контроллера корневого представления окна
- Как полноэкранный режим в иерархии экранов, управляемых UINavigationController
- В полноэкранном режиме, представленном на вкладке
- В виде полноэкранного режима, представленного с помощью presentModalViewController: анимированный:
Пока вы используете контроллер представления в этих контекстах (плюс пару других контекстов на iPad), вы можете надежно управлять жизненным циклом вашего представления с помощью методов loadView, viewDidLoad, viewWillAppear:animated:, viewDidAppear:animated:, viewWillDisappear:animated: и viewDidDisappear: animated:, и viewDidUnload (опять же, учитывая, что viewDidUnload вызывается не всегда ).
Обычно вам следует передавать представление контроллера представления в addSubview: только тогда, когда вы добавляете представление вашего корневого контроллера представления в окно. Если вы хотите попробовать использовать вложенный контроллер просмотра для управления не полноэкранным подвидом, вам придется вызывать его методы viewWill / didAppear / Disappear:animated: и viewDidUnload вручную в соответствующее время с контроллера вашего полноэкранного просмотра.
Комментарии:
1. Обратите внимание: «Контроллеры просмотра предназначены для управления полноэкранными представлениями».
Ответ №2:
viewDidUnload
вызывается при выгрузке UIViewControllers
‘s view
, а не при удалении вложенного представления из view
.
Комментарии:
1. Когда представление скрыто, а iOS решает, что ему требуется больше памяти, и освобождает невидимое представление.
2. ОК. Так что это часть памяти и ОС воспроизводит все это. Спасибо!
Ответ №3:
viewdidunload — это метод UIViewController. Если вы используете подкласс UIViewController для создания объекта и представление этого объекта удалено из superview, то будет вызван viewdidunload. Убедитесь, что ваш дочерний просмотр создан из UIViewController.
Комментарии:
1. Мой дочерний элемент наследуется только от UIViewController. Но он не вызывается. Есть еще предложения?
Ответ №4:
Дополнительное примечание заключается в том, что viewDidUnload может не выполняться перед освобождением. Это происходит, когда количество ссылок UIViewController достигает 0.
Как говорится в шаблоне Xcode:
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}