Как меняется общая иерархия представлений при использовании манипуляций с представлениями UIKit? - PullRequest
4 голосов
/ 19 марта 2010

Я пытался выяснить, что происходит в иерархии представлений, когда используются такие методы, как pushViewController:animated, presentModalViewController:animated и переключатели вкладок в UITabBarViewController, а также UIAlertView и UIActionSheet.

(Примечание: я делаю это, потому что мне нужно знать, виден ли конкретный UIView моего создания на экране, когда я ничего не знаю о том, как оно или его суперпредставление могли быть добавлены в иерархию представления. Если кто-то знает хороший способ определить это, я бы приветствовал знание.)

Чтобы понять это, я вышел из иерархии подпредставлений [[UIApplication sharedApplication] keyWindow] в различных обстоятельствах. Правильно ли следующее:

  1. Когда новый viewController помещается в стек UINavigationController, старый вид viewController больше не равен в иерархии представлений . Таким образом, только представление контроллера верхнего представления является подпредставлением представления UINavigationController (согласно журналам это фактически несколько частных классов, таких как UILayoutContainerView). Виды контроллеров представления ниже верхнего контроллера стека фактически удалены из окна?

  2. Очень похожая вещь происходит, когда новый viewController представлен через presentModalViewController:animated. Новое представление viewController - единственное подпредставление окна kew . Это правильно?

  3. Самое простое для понимания: UIAlertView создает свое собственное окно и делает его ключевым.

  4. Самое странное, с чем я столкнулся: UIActionSheet отображается с помощью метода showInView:, actionSheet вообще не находится в иерархии представлений . Это не подпредставление представления, переданного в качестве аргумента showInView:, оно не добавляется в качестве подпредставления ключевого окна и не создает своего собственного окна. Как это выглядит, тогда?

  5. Я еще не пробовал, поэтому я хотел бы знать, что происходит в иерархии keyWindow при переключении вкладок в UITabBarController. Вид выбранного UIViewController перемещен в верхнюю часть или он работает как с pushViewController:animated и presentModalViewController:animated, где только отображаемый вид находится в иерархии окон?

Ответы [ 3 ]

1 голос
/ 19 марта 2010

Я думаю, что вы концептуально путаете представления и контроллеры представлений. И контроллер навигации, и контроллер панели вкладок, другие контроллеры представления. Ни один не управляет взглядами.

Не существует иерархии представлений для всего приложения, существует только иерархия контроллеров представлений. Иерархия представлений существует только при загрузке каждого управляемого представления. Тогда у вас есть временная иерархия окна -> viewController.view -> viewController.view.subviews. Когда вы помещаете в стек другой контроллер представлений, вы получаете другую иерархию представлений.

Иерархия представлений - это иллюзия сцены, которую видит пользователь. Иерархия контроллера представления - это набор сцен / сценарий, который программист использует для создания этой иллюзии. Не путайте их.

Итак:

  1. Виды контроллеров представления ниже верхнего контроллера стека фактически удалены из окна? Да. Когда контроллер представления извлекается из стека, его представление исчезает. Зачем тратить память на представление, которое пользователь больше никогда не увидит?
  2. Новое представление viewController является единственным подпредставлением окна kew. Это правильно? Да.
  3. ... UIAlertView создает свое собственное окно и делает его ключевым. Да.
  4. ... actionSheet вообще не находится в иерархии представлений. ... Как это выглядит, тогда? Добавляется приложением над окном. Вот что делает его особенным. Это также то, что делает возможным отображаться над всеми другими представлениями, даже если эти представления не выполняются.
  5. Вид выбранного UIViewController перемещен в верхнюю часть Да. Опять сценическая иллюзия. Вы меняете одно представление контроллеров на другое.
0 голосов
/ 27 марта 2010

следующие методы в UIView могут делать то, что вам нужно:

– didAddSubview:
– didMoveToSuperview
– didMoveToWindow
– willMoveToSuperview:
– willMoveToWindow:
– willRemoveSubview:
0 голосов
/ 19 марта 2010

Я теперь выполнил тот же самый тип регистрации для UITabBarViewController, поэтому, учитывая часть 5:

Кажется, что он работает так же, как UINavigationController:в иерархии представлений keyWindow.

...