Каков правильный порядок сообщений UIViewController, которые я должен отправить, когда вы не используете transitionFromViewController?

При реализации UIViewController сдерживания, каков правильный порядок следующих сообщений, которые я должен отправить при обмене одним дочерним контроллером с другим?

Является ли это ниже, или мой порядок неверен? Я пропускаю сообщения?

  • Добавить новый дочерний контроллер в текущий контроллер: addChildViewController:
  • Добавить подвью нового дочернего контроллера к представлению текущего контроллера: addSubview:
  • Запустите некоторый причудливый переход от старого представления к новому.
  • Сообщите новый дочерний контроллер, который был добавлен в другой контроллер: didMoveToParentViewController:
  • Удалите предыдущий вид контроллера из его супервизора: removeFromSuperview:
  • Удалите предыдущий дочерний контроллер из его родителя: removeFromParentViewController:

EDIT: Я должен аннотировать, что вышеизложенное становится проблемой только того, что вы не используете методы перехода UIViewController, но хотите добавить новое представление вручную.

Ответ 1

Хорошо, понял. Все это в документах, но я нахожу это довольно хорошо скрытым. Я разберу его на три случая, потому что думаю, что это может помочь другим. Почему я делаю это так сложно, а не используя [UIViewController transitionFromViewController:toViewController:duration:options:animations:completion]? Ответ заключается в том, что вы можете использовать только метод перехода, если уже существует существующий контроллер представлений. Если вы хотите перейти от "без контроллера" к некоторому контроллеру или наоборот, указанный выше метод выдает исключение.

Случай 1: Оба контроллера равны - это включает в себя: null

  • Ничего не делать, у нас уже есть то, что мы хотим на экране.: -)

Случай 2: Старый контроллер имеет значение NULL, а новый контроллер не равен NULL. Просто добавьте новый контроллер.

  • Отправьте addChildViewController новому контроллеру - это вызовет неявный willMoveToParentViewController
  • Сделайте новый вид нужного размера
  • Вставьте представление дочернего контроллера в эту иерархию представления контроллера: addSubview
  • Сообщите дочернему контроллеру, что он был добавлен в качестве дочернего элемента, отправив его: didMoveToParentViewController

Случай 3: старый контроллер не является NULL, а новый контроллер не равен NULL. Запустите переход между контроллерами.

  • Отрегулируйте новые рамки/рамки представления.
  • Отправьте addChildViewController новому контроллеру - это вызовет неявный willMoveToParentViewController
  • Отправьте старый контроллер willMoveToParentViewController и передайте его в качестве нового родителя
  • Добавить новое представление в ваше представление
  • Запустите свой пользовательский переход между старым и новым видом с помощью анимации UIView's.
  • В конце делегата анимации отправьте didMoveToParentViewController на новый контроллер.
  • Удалить представление старого контроллера из его супервизора.
  • Отправьте removeFromParentViewController на старый контроллер - это вызовет неявный didMoveToParentViewController