Что называется при удалении представления из его суперпредставления? - PullRequest
1 голос
/ 28 июля 2011

Представьте, что у меня есть контроллер вида с именем blueView и другой с именем greenView.Затем я добавляю greenView.view как подпредставление blueView.view.Теперь предположим, что после некоторого взаимодействия с пользователем я хотел бы удалить greenView.view из blueView.view, используя:

[self.view removeFromSuperview]

Что на самом деле здесь происходит?blueView.view когда-либо перерисовывается?Я думал, что метод viewDidLoad может быть вызван, однако после помещения сообщения NSLog в viewDidLoad он никогда не вызывался после удаления подпредставления.Будем весьма благодарны за любые разъяснения относительно того, что на самом деле происходит, когда вы удаляете подпредставление из его суперпредставления.

1 Ответ

4 голосов
/ 28 июля 2011

Во-первых, контроллер представления предназначен для одновременного управления всей иерархией представления;у вас не должно быть двух активных контроллеров представления (кроме контроллеров контейнера, таких как UINavigationController) одновременно.См. этот ТАК вопрос и мой ответ , чтобы лучше понять этот важный момент.Таким образом, конкретная ситуация, которую вы описываете, не должна возникать.(Кроме того, люди часто путают представления и контроллеры представлений, поэтому не полезно давать названиям ваших контроллеров представлений, оканчивающихся на «-view», например «blueView». Чтобы избежать путаницы, назовите его «blueViewController».)

Во-вторых, как указывает @InsertWittyName, -viewDidLoad - это метод UIViewController, а не метод UIView.Делая этот шаг дальше, ни контроллеры представления, ни -viewDidLoad не играют никакой роли в добавлении или удалении подпредставлений из представления.-viewDidLoad вызывается при первом создании представления контроллера представления.По сути, это просто способ отложить относящуюся к представлению часть инициализации контроллера представления до тех пор, пока не будет создана иерархия представления, поэтому нет причин, чтобы он вызывался снова только потому, что подпредставление было удалено из иерархии.

Наконец, то, как именно представление удаляет себя из своего суперпредставления, на самом деле является деталью реализации - оно может вызывать закрытый метод UIView для суперпредставления или оно может напрямую изменять список подпредставлений суперпредставления или что-то еще.Я не вижу в документации ничего, что явно говорит о том, что суперпредставление будет перерисовываться после удаления подпредставления, но по моему опыту суперпредставление действительно перерисовывает себя.Вы можете проверить это, установив точку останова на методе -drawRect суперпредставления.

...