Что такое Unwind segues и как вы их используете?

iOS 6 и Xcode 4.5 имеют новую функцию, называемую «Unwind Segue»:

Unwind segues позволяет перейти к существующим экземплярам сцен в раскадровке

В дополнение к этой краткой записи в примечаниях к выпуску Xcode 4.5, UIViewController теперь, похоже, имеет несколько новых методов:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender - (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender - (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 

Как работают разматывающие работы и для чего их можно использовать?

    5 Solutions collect form web for “Что такое Unwind segues и как вы их используете?”

    В двух словах

    Развертка segue (иногда называемая exit segue ) может использоваться для перехода назад через push, modal или popover segues (как если бы вы вытащили навигационный элемент из панели навигации, закрыли popover или уволили модально представленный контроллер представления). Кроме того, вы можете фактически развернуть не только одну, но и серию push / modal / popover segues, например, «вернуться назад» к нескольким шагам в вашей навигационной иерархии с помощью одного режима размотки.

    Когда вы выполняете размотку segue, вам нужно указать действие, которое является методом действия контроллера вида, который вы хотите восстановить.

    Objective-C:

     - (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue { } 

    Swift:

     @IBAction func unwindToThisViewController(segue: UIStoryboardSegue) { } 

    Имя этого метода действий используется, когда вы создаете раскручивающийся сегмент в раскадровке. Кроме того, этот метод вызывается непосредственно перед выполнением разматывания. Вы можете получить контроллер представления исходного кода из переданного параметра UIStoryboardSegue для взаимодействия с контроллером представления, который инициировал segue (например, чтобы получить значения свойств модального контроллера представлений). В этом отношении метод имеет аналогичную функцию метода prepareForSegue: UIViewController .

    Обновление iOS 8: Unwind segues также работают с адаптивными сегментами iOS 8, такими как Show and Show Detail .

    Пример

    Будем иметь раскадровку с контроллером навигации и тремя контроллерами детского вида:

    введите описание изображения здесь

    С помощью контроллера Green View вы можете расслабиться (вернуться назад) к контроллеру Red View. От Blue вы можете расслабиться до зеленого или красного цвета через зеленый. Чтобы включить разматывание, вы должны добавить специальные методы действий к красным и зеленым, например, вот метод действий в красном:

    Objective-C:

     @implementation RedViewController - (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue { } @end 

    Swift:

     @IBAction func unwindToRed(segue: UIStoryboardSegue) { } 

    После того, как был добавлен метод действия, вы можете определить разматывание seegue в раскадровке, перетащив управление на значок «Выход». Здесь мы хотим развернуть красный цвет от зеленого цвета при нажатии кнопки:

    введите описание изображения здесь

    Вы должны выбрать действие, которое определено в контроллере представления, который вы хотите восстановить:

    введите описание изображения здесь

    Вы также можете расслабиться от красного до синего (который находится в «двух шагах» в стеке навигации). Ключ выбирает правильное раскручивание.

    Перед выполнением операции размотки вызывается метод действия. В этом примере я определил разматывание красного на зеленый и синий. Мы можем получить доступ к источнику размотки в методе действий с помощью параметра UIStoryboardSegue:

    Objective-C:

     - (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue { UIViewController* sourceViewController = unwindSegue.sourceViewController; if ([sourceViewController isKindOfClass:[BlueViewController class]]) { NSLog(@"Coming from BLUE!"); } else if ([sourceViewController isKindOfClass:[GreenViewController class]]) { NSLog(@"Coming from GREEN!"); } } 

    Swift:

     @IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) { if let blueViewController = unwindSegue.sourceViewController as? BlueViewController { println("Coming from BLUE") } else if let redViewController = unwindSegue.sourceViewController as? RedViewController { println("Coming from RED") } } 

    Размотка также работает через комбинацию push / modal segues. Например, если бы я добавил еще один контроллер Yellow View с модальным сегментом, мы могли бы расслабиться от желтого до Red Red Remover за один шаг:

    введите описание изображения здесь

    Разматывание кода

    Когда вы определяете разматывание с помощью элемента управления, перетаскивая что-то в символ «Выход» контроллера вида, в структуре документа появляется новый отступ:

    введите описание изображения здесь

    Выбор сегмента и переход к инспектору атрибутов показывает свойство «Идентификатор». Используйте это, чтобы дать уникальный идентификатор вашему сеансу:

    введите описание изображения здесь

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

    Objective-C:

     [self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self]; 

    Swift:

     performSegueWithIdentifier("UnwindToRedSegueID", sender: self) 

    Что касается использования разматывания в StoryBoard …

    Шаг 1)

    Перейдите к коду для контроллера вида, к которому вы хотите расслабиться, и добавьте следующее:

    Objective-C

     - (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue { //nothing goes here } 

    Обязательно также объявляйте этот метод в файле .h в Obj-C

    стриж

     @IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) { //nothing goes here } 

    Шаг 2)

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

    введите описание изображения здесь

    Теперь должна быть возможность подключения к «- unindToViewControllerNameHere»

    Вот и все, ваш segue раскрутится, когда ваша кнопка нажата.

    Unwind segues используются для «возврата» к некоторому контроллеру представлений, из которого через несколько раз вы попали в «текущий» контроллер вида.

    Представьте, что у вас есть что-то MyNavController с A качестве его корневого контроллера. Теперь вы используете push-сегу в B Теперь контроллер навигации имеет A и B в своем массиве viewControllers , а B видна. Теперь вы представляете C modally.

    С помощью разматывания вы можете теперь расслабиться «назад» от C до B (то есть уклониться от модально представленного контроллера представлений), в основном «отменив» модальный сегмент. Вы можете даже полностью расслабиться до контроллера A корневого представления, отменив как модальный переход, так и push-сегу.

    Разморозить сегменты облегчают возврат. Например, перед iOS 6 наилучшей практикой для отклонения представленных контроллеров представлений было задание контроллера представления представления в качестве представленного делегата диспетчера представления, а затем вызов вашего пользовательского метода делегирования, который затем отклоняет представленныйViewController . Звук громоздкий и сложный? Это было. Вот почему раскручивайте segues приятно.

    Что-то, о чем я не упоминал в других ответах здесь, так это то, как вы справляетесь с разворачиванием, когда не знаете, откуда начался первоначальный переход, что для меня является еще более важным вариантом использования. Например, скажем, у вас есть диспетчер просмотра справки ( H ), который вы показываете модально с двух разных контроллеров ( A и B ):

    AH
    BH

    Как настроить разматывание, чтобы вернуться к правильному контроллеру? Ответ заключается в том, что вы объявляете отменное действие в A и B с тем же именем , например:

     // put in AViewController.swift and BViewController.swift @IBAction func unwindFromHelp(sender: UIStoryboardSegue) { // empty } 

    Таким образом, разматывание найдет какой-либо контроллер ( A или B ) просмотра, инициировавший segue, и вернется к нему.

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

    Swift iOS:

    Шаг 1. Определите этот метод в представлении контроллера MASTER. в котором вы хотите вернуться:

     //pragma mark - Unwind Seques @IBAction func goToSideMenu(segue: UIStoryboardSegue) { println("Called goToSideMenu: unwind action") } 

    Шаг 2: (StoryBoard) Нажмите правой кнопкой мыши на кнопку SLAVE / CHILD EXIT и выберите «goToSideMenu». Как действие для подключения кнопки, на которую вы нажмете, чтобы вернуться к вам. Вид контроллера MASTER:

    введите описание изображения здесь Шаг 3. Создание и запуск …

    Interesting Posts

    Как транслировать видео в реальном времени с iPhone

    iOS: изменение объема устройства

    UITableView reloadData crash

    Как я могу наложить панель поиска над MapKit?

    MPMoviePlayerController перестает работать в полноэкранном режиме // портретная ориентация // iOS 7

    Будет ли случайный () когда-либо изменяться?

    Как загружать, прокручивать и зажимать и увеличивать * .svg изображение на устройстве iOS с помощью Objective -C

    Контроллер панели вкладок внутри контроллера uinavigation

    Могу ли я наблюдать, когда UIViewController изменяет интерфейсОриентации?

    переключение ввода для uitextfield

    Загружайте файлы в фоновом режиме без остановки через 10 минут в iOS7 / iOS8

    ALAssets получают видеоданные

    ABAddressBook fromOpaque (_ :) в Swift 3

    Каков наилучший способ изменить цвет / представление вида аксессуара индикатора раскрытия в ячейке представления таблицы в iOS?

    Рисование UIBezierPath сгенерированного кода UIView

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.