Каков правильный порядок хранения сообщений UIViewController, которые я должен отправлять, когда не используется transitionFromViewController? - PullRequest
10 голосов
/ 29 марта 2012

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

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

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

РЕДАКТИРОВАТЬ: Я должен отметить, что вышеприведенное становится толькопроблема в том, что вы не используете методы перехода UIViewController, а хотите добавить новое представление вручную.

1 Ответ

15 голосов
/ 02 апреля 2012

Ладно, разобрался.Это все в документах, но я нахожу это довольно хорошо спрятанным.Я разделю это на три случая, потому что я думаю, что это могло бы помочь другим.Почему я так усложняю вместо использования [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
...