Техническое примечание TN2298

Используя раскручивают переходы

Этот документ обеспечивает, обзор раскручивают переходы.

Введение
Создание раскрутить переход
Раскрутить процесс
Обязанности по контейнерным контроллерам представления
Дополнительные ресурсы.
История версии документа

Введение

Успокойтесь переходы дают Вам способ «раскрутить» штабель навигации назад посредством нажатия, модального, легкая сдоба и другие типы переходов. Вы используете, раскручивают переходы для движения одного или более шагов в иерархии навигации. В отличие от нормального перехода, которые создают новый экземпляр их целевого контроллера представления и переходов к нему, раскрутить переход переходы к существующему контроллеру представления в Вашей иерархии навигации. Обратные вызовы предоставлены и для источника и для целевого контроллера представления, прежде чем начнется переход. Можно использовать эти обратные вызовы для передачи данных между контроллерами представления.

При создании раскрутить перехода в Интерфейсном Разработчике, Вы не указываете целевой контроллер представления. Раскрутить переход определяет, какой контроллер представления в Вашей иерархии навигации раскрутить к тому, когда это инициировано во время выполнения. Этот процесс является настраиваемыми и дополнительными точками настройки, предоставлены для контейнерных контроллеров представления для участия в раскрутить процессе. Посмотрите, Как Раскрутить Переход Определяет свой Целевой Контроллер Представления.

Создание раскрутить переход

Прежде чем можно будет начать добавлять, раскручивают переходы в Интерфейсном Разработчике, необходимо определить, по крайней мере один раскручивает действие. Раскрутить действие является методом экземпляра с a UIStoryboardSegue как его единственный параметр и чей тип возврата IBAction. Нет никаких требований для имени метода, но необходимо выбрать имя, которое и уникально и значимо в контексте целого приложения. Как IBActions и IBOutlets, успокойтесь, действия не должны быть объявлены в Вашем заголовочном файле класса. Исключение - то, если Вы пишете платформу и хотите, чтобы клиенты Вашей платформы были в состоянии создать раскрутить переход, предназначающийся для Вашего действия.

  Определение перечисления 1 В качестве примера раскрутить действия.

/* Objective-C */
- (IBAction)unwindToMainMenu:(UIStoryboardSegue*)sender
{
    UIViewController *sourceViewController = sender.sourceViewController;
    // Pull any data from the view controller which initiated the unwind segue.
}
 
/* Swift */
@IBAction func unwindToMainMenu(sender: UIStoryboardSegue)
{
    let sourceViewController = sender.sourceViewController
    // Pull any data from the view controller which initiated the unwind segue.
}

При создании раскрутить перехода в раскадровке Вы указываете имя раскрутить действия в контроллере представления, к которому Вы хотите, чтобы переход раскрутился. Это раскручивается, действие вызывается непосредственно перед тем, как раскрутить переход выполняется. Можно получить доступ sourceViewController из UIStoryboardSegue параметр для получения любых данных от контроллера представления, инициировавшего раскрутить переход.

Добавление раскрутить переход к раскадровке

Добавить раскрутить переход к сцене, control+drag от объекта (такого как кнопка, ячейка табличного представления или вкладка просматривает элемент) в сцене к значку выхода сцены, выделенному на рисунке 1. Выберите раскрутить действие для нового перехода из всплывающего меню.

Рисунок 1  значок выхода для сцены является оранжевой иконкой справа.

Добавить раскрутить переход, который будет только инициирован программно, control+drag от значка контроллера представления сцены до его значка выхода как показано на рисунке 2. Выберите раскрутить действие для нового перехода из всплывающего меню. Необходимо также дать переходу идентификатор так, чтобы на него мог сослаться код. Раскрутить переход может быть инициирован путем отправки a -performSegueWithIdentifier:sender: обменивайтесь сообщениями к контроллеру представления сцены.

Рисунок 2  , Создающий программно инициируемый, раскручивает переход.

Как только Вы добавили раскрутить переход, это появится в схеме для сцены, как показано на рисунке 3.

Рисунок 3  Раскручивается, переходы для каждой сцены выведены на экран на полке.

Раскрутить процесс

В этом разделе описываются процесс, происходящий сразу после того, как раскрутить переход инициируется, или пользователем, взаимодействующим с управлением в сцене или Вашим кодом, отправляющим a performSegueWithIdentifier:sender: обменивайтесь сообщениями к контроллеру представления.

  1. Раскрутить переход пересекает Вашу иерархию навигации для определения местоположения целевого контроллера представления. Этот шаг описан подробно под тем, Как Раскрутить Переход Определяет свой Целевой Контроллер Представления.

  2. Контроллер представления, инициировавший раскрутить переход, отправляется a prepareForSegue:sender: сообщение. Реализация по умолчанию ничего не делает. Ваш контроллер представления может переопределить этот метод для передачи данных целевому контроллеру представления.

  3. Целевой контроллер представления раскручивается, действие вызывается.

  4. Раскрутить переход анимирует визуальный переход между источником и целевым контроллером представления.

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

Как Раскрутить Переход Определяет свой Целевой Контроллер Представления

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

Запуск с контроллера представления, инициировавшего раскрутить переход, который поисковый порядок следующие:

  1. Следующий контроллер представления в цепочке респондента отправляется a viewControllerForUnwindSegueAction:fromViewController:withSender: сообщение. Для контроллера представления, представленного модально, это будет вызвавшим контроллером представления presentViewController:animated:completion:. Иначе, parentViewController.

    Реализация по умолчанию ищет получатель childViewControllers массив для контроллера представления, хотящего обработать раскрутить действие. Если ни один из дочерних контроллеров представления получателя не хочет обработать раскрутить действие, проверки получателя, хочет ли оно обработать раскрутить действие и возвраты self если это делает. В обоих случаях, canPerformUnwindSegueAction:fromViewController:withSender: метод используется, чтобы определить, хочет ли данный контроллер представления обработать раскрутить действие.

  2. Если никакой контроллер представления не возвращается из viewControllerForUnwindSegueAction:fromViewController:withSender: на шаге один, поиск повторяется от следующего контроллера представления в цепочке респондента.

Реализация по умолчанию canPerformUnwindSegueAction:fromViewController:withSender: возвраты YES если получатель отвечает на предоставленное действие. Контроллер представления может переопределить canPerformUnwindSegueAction:fromViewController:withSender: если дополнительная гранулярность требуется, чтобы определять, может ли контроллер представления быть местом назначения раскрутить перехода. Это может быть необходимо для удаления неоднозначности, вызванной при наличии многократных экземпляров того же контроллера представления на штабеле навигации.

Обязанности по контейнерным контроллерам представления

Контейнерные контроллеры представления имеют две ответственности в раскрутить процессе, оба обсужденные ниже. Если Вы используете контейнерный контроллер представления, предоставленный SDK (UINavigationController, UITabBarController...) они обрабатываются автоматически.

Выбор дочернего контроллера представления для обработки раскрутить действия

Контейнерный контроллер представления должен реализовать метод, показанный в Перечислении 2, если пользовательская логика требуется, чтобы определять, какой из дочерних контроллеров представления контейнера, если таковые имеются, хотят обработать раскрутить действие. Например, UINavigationControllerреализация ищет контроллеры представления на своем штабеле навигации, в обратном порядке начинающемся с вершины. Если ни один из дочерних контроллеров представления контейнера не хочет обработать раскрутить действие, вызовите реализацию super и возвратите результат.

Перечисление 2  Переопределяет этот метод для возврата дочернего контроллера представления, хотящего обработать раскрутить действие.

/* Objective-C */
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
 
/* Swift */
override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController?

Переход между двумя дочерними элементами просматривает контроллеры

Как только раскрутить переход определил местоположение своего целевого контроллера представления, он пытается определить местоположение раскрутить исполнителя для перехода. Раскрутить исполнитель является общим предком и контроллера представления, инициировавшего раскрутить переход и целевой контроллер представления. Это ответственно за создание a UIStoryboardSegue который будет использоваться для выполнения визуального перехода между источником и целевыми контроллерами представления.

Когда Ваш контейнер возвращает контроллер представления из viewControllerForUnwindSegueAction:fromViewController:withSender: контейнер становится раскрутить исполнителем для перехода. Ваш контейнерный контроллер представления должен поэтому реализовать метод, который, как показывают в Перечислении 3, возвратил a UIStoryboardSegue это выполняет любые анимации, и другие шаги необходимы для перехода от контроллера представления, инициировавшего раскрутить переход (fromViewController) к целевому контроллеру представления (toViewController). Возвращенный объект должен быть экземпляром UIStoryboardSegue создаваемое использование segueWithIdentifier:source:destination:performHandler: или Ваш собственный подкласс.

  Реализация перечисления 3 этот метод для возврата UIStoryboardSegue, что переходы между fromViewController и toViewController.

/* Objective-C */
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
 
/* Swift */
override func segueForUnwindingToViewController(toViewController: UIViewController, fromViewController: UIViewController, identifier: String?) -> UIStoryboardSegue

Дополнительные ресурсы.

Успокойтесь переходы обсуждены в 2012 WWDC: Принятие Раскадровок в Вашем сеансе Приложения.

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



История версии документа


ДатаПримечания
04.02.2015

Редакционные изменения.

13.08.2013

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