Як виконати програму Unwind segue?


307

Використовувати розкадровку це дуже просто. Ви просто перетягніть дію до "Виходу". Але як я можу викликати це зі свого коду?


33
Я вважаю це справедливим питанням - у мене було це саме. Ви можете виконати розмотування програмної програми 1. створивши ручну segue (перетягнути ctrl від власника файлу до виходу), 2. давши їй ім'я в IB, потім 3. виконавши звичайний -performSegueWithIdentifier: sender: у своєму коді.
Ян Мейєр

6
Не слід було закривати ІМО. Користувачі, які проголосували за закриття цього питання, впевнені, що у них немає фону Obj-C / Cocoa Touch.
LJ Wilson

Ян: Як ви даєте йому ім'я?
сарфата

Я просто використовую [selfmissmissViewControllerAnimated: YES завершення: нуль]; щоб вийти програмно. Я не знаю, це правильний шлях чи ні.
tangqiaoboy

1
sarfata: Спочатку ви створюєте "ручне розмотування segue" за допомогою ctrl-перетягування з viewcontroller до "Exit". Тоді ви зможете знайти виразку в «Нарисі документа».
huggie

Відповіді:


283
  1. Створіть вручну segue ( ctrl-драг від власника файлу до виходу),
  2. Виберіть його в меню "Лівий контролер" під зеленою кнопкою EXIT.

Виберіть його в меню "Лівий контролер" під зеленою кнопкою EXIT

Вставте ім’я Segue для розмотування.

Потім, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.з вашим Segue визначити.


25
1) "Власник файлу" - чи не така стара термінологія? Мені працювало, щоб контролювати перетягування з контролера перегляду на його піктограму Exit. 2) Хоча це повинно бути очевидним, Xcode шукає декларацію в інтерфейсі IBAction, яка приймає аргумент UIStoryboardSegue; WWDC 2012 сеанс 407 розмови про це не згадував і не вставив цей код. Без нього мій значок «Вихід» не активувався при перетягуванні до нього контролю. 3) Досить прикольно, що наприкінці великої червоної стрілки в полі Дія ви можете натиснути стрілку «туди»!
tobinjim

71
Для тих, хто, як і я, все ще має проблеми з реалізацією цієї відповіді, я зібрав більш ретельний посібник та приклад у цьому репо: github.com/bradley/iOSUnwindSegueProgramatic (Не намагаючись рекламувати себе, я просто вдарив голову об стіну протягом декількох годин і бачення робочої установки допомагає мені.)
bradleygriffith

3
@bradleygriffith Ви надзвичайно надзвичайний. Дякуємо за чудову інструкцію!
Eli_Rozen

7
@bradleygriffith Я б хотів, щоб ти зробив цю відповідь, щоб я міг позначити і це! Ваш унікальний внесок у встановленні того, який контролер перегляду отримує який код . Не вдалося його знайти ніде. Дякую!
Аарон Вег

3
Ключовим моментом, для кого все ще натрапили на це, є те, що IBACTION повинен знаходитися в контролері перегляду, в який ви повертаєтесь, а не в тому, в якому ви зараз перебуваєте. @Bradleygriffith це пише на GitHub, але я цього не бачив згадується деінде. Ця частина є критичною.
Axeva

163

Ось повна відповідь із цілями C та Swift:

1) Створіть IBActionрозмотаний мозок у вашому контролері подання пункту призначення (куди ви хочете перейти). Файл реалізації в будь-якому місці.

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) На контролері подання джерела (контролері, з якого ви переслідуєте), ⌃ + перетягніть з "Назва діяльності", щоб вийти. У спливаючому віці ви повинні побачити розмотаний мозок, створений на кроці 1. (Якщо ви цього не бачите, перегляньте перший крок). Виберіть undindToContainerVC: зі спливаючого вікна або того, що ви назвали своїм методом, щоб підключити ваш вихідний контролер до розмотуваного IBAction.

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

3) Виберіть segue в документі контролера подання джерела контур дошки (вона буде вказана внизу) та вкажіть її ідентифікатор .

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

4) Викличте розмотувану segue, використовуючи цей метод, з контролера подання джерела , замінивши своє ім'я розмотування.

// Завдання С

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

// Швидкий

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB. Використовуйте властивість sourceViewController параметру segue у методі розмотування, щоб отримати доступ до будь-яких відкритих властивостей контролера джерела. Також зауважте, що рамка обробляє відхилення контролера джерела. Якщо ви хочете підтвердити це, додайте до контролера джерела метод dealloc з повідомленням журналу, яке повинно запускатися після його вбивства. Якщо dealloc не спрацьовує, у вас може виникнути цикл утримання.


2
Моя програма не працює, навіть не називається(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
xhg

2
це рішення не працює, коли контролер перегляду, який ви розмовляєте, існує лише у вашій дошці, але він не має спеціального коду в реалізації коду
mnl

@mnl не впевнений, що саме ти кажеш, але це працює зі сценами з розкадровками або підказками. Якщо ви створюєте в коді сцену перегляду контролера, ви б не використовували жодних методів, які "повертають" ІБ у їх ім'я, що все-таки є нікчемним, оскільки вони служать меті зв'язку між кодом та ІБ. Це стосується вашого коментаря?
smileBot

1
Ваша картинка із зображенням ctrl+dragвід ViewControllerдо Exitбула неймовірно корисною. Дякую!
kbpontius

Для Swift 4.2 використовуйте: self.performSegue (withIdentifier: "unindToVC", відправник: self)
Reefwing

81

bradleygriffithВідповідь була чудовою. Я зробив крок 10 і зробив скріншот для спрощення. Це скріншот у Xcode 6.

  1. Перетягніть курсор з помаранчевої піктограми на червону піктограму Exit, щоб створити розмотування без жодних дій / кнопок у вікні перегляду.

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

  1. Потім виберіть unwind segueна бічній панелі:

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

  1. Встановити рядок Segue Identifier:

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

  1. Доступ до цього ідентифікатора з коду:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

4
Перш за все, метод розмотування повинен бути включений всередину UIViewController. Тоді ваше рішення спрацює
Alex Cio

5
і вам доведеться встановити «Ідентифікатор» на цей новий Segue! Не забувайте про це.
kraag22

1
Чи можливо створити з'єднання "вихід" у контролері подання джерела програмно?
Андрій Кірна

13

Я використав, [self dismissViewControllerAnimated: YES completion: nil];що поверне вас до дзвінка ViewController.


6
Ларрі, це абсолютно вірний підхід, якщо ви хочете повернутися до попереднього контролера перегляду, тобто до того, який представив той, з якого ви зараз виходите. Питання виникло тому, що нове в Xcode 4.5 - це можливість "розмотати" від одного контролера перегляду десь у порядку подання на набагато раніше контролер перегляду. Детальніше див. У сесії WWDC 2012 року 407.
tobinjim

11

Цитування тексту з Технічної примітки Apple щодо розмотування Segue: Щоб додати розмотувану пробку, яка буде запускатися лише програмно, керуйте + перетягуйте з піктограми контролера виду сцени до її вихідної піктограми, а потім виберіть із спливаючого меню дію для розгортання.

Посилання на технічну примітку


6

Вище відповідь Вішала Чадрі працювала на мене. Я також додам, що для того, щоб вручну запустити послідовність, використовуючи:

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

зсередини ViewController ви також повинні вибрати розмотаний шей у сцені ViewController на сцені розкладу та у вікні властивостей на RHS переконатися, що поле Indentifier містить намер, на який ви посилаєтесь у коді ("mySegueName" у прикладі вище) ).

Якщо ви пропустите цей крок, рядок вище буде винятком того, що ім'я послідовності не відоме.


3

Сумісне назад рішення, яке буде працювати для версій до ios6, для тих, хто цікавиться:

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}

2
Розмотування моніторів робить набагато більше, ніж перескакування до певного класу в стеку навігаційного контролера.
Стів Мозер

2

SWIFT 4 :

1. Створіть @IBAction з контролером Segue, який ви хочете відмовити :

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. У дошці розкадрування від контролера, який ви хочете відшаровувати (розкручувати) від ctrl + перетягнути зі знака контролера, щоб вийти зі знаку та виберіть метод, який ви створили раніше:

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

3. Тепер ви можете помітити, що у структурі документа у вас є новий рядок із заголовком "Розмотати segue ....". Тепер слід натиснути на цей рядок і відкрити інспектор атрибутів, щоб встановити ідентифікатор (у моєму випадку undindSegueIdentifier ).

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

4. Ви майже закінчили! Тепер вам потрібно відкрити контролер перегляду, від якого ви хочете розмотатися, і створити якийсь метод, який буде виконувати segue. Наприклад, ви можете додати кнопку, з'єднати її з кодом з @IBAction , після чого всередині цього IBAction додати perfromSegue (withIdentifier: sender :) метод:

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

Отже, це все, що вам потрібно зробити!


Чи можливо створити з'єднання "вихід" у контролері подання джерела програмно?
Андрій Кірна

1

Swift 4.2, Xcode 10+

Для тих, хто цікавиться, як це зробити за допомогою VC, не встановлених через дошку розкадрування (ті, хто приходить до цього питання, шукають "програмно" + "розмотати segue").

Зважаючи на те, що ви не можете налаштувати розмотувальну пробку програмно, найпростішим виключно програмним рішенням є виклик:

navigationController?.popToRootViewController(animated: true)

який поверне всі контролери перегляду на стеку назад до вашого кореневого контролера перегляду.


Щоб вивести найвищий контролер виду з навігаційного стеку, використовуйте:

navigationController?.popViewController(animated: true)


1
зазвичай це більше, ніж ви хочете, - щоб перейти назад, просто зробіть: [self.navigationController popViewControllerAnimated: ТАК];
Енді Вайнштейн

Дійсно, я додав це до своєї відповіді - дякую @AndyWeinstein
10623169

0

FYI: Для того, щоб відповідь @ Вадима працювала з ручною дією розгортання послідовності, викликаною зсередини контролера перегляду, ви повинні розмістити команду:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

всередині методу переглянутого класу viewDidAppear так:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

Якщо ви розмістите його в інших методах ViewController, таких як viewDidLoad або viewWillAppear, він буде ігнорований.


3
Однозначно неправильно. Зателефонуйте виконайтеSegueWithIdentifier з будь-якого місця.
усмішкаБот

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

@ Пахнєв так. Я не знаю, як ця відповідь отримала відгуки. Виклик performSegueWithIdentfierробить саме так: виконує передачу даних від одного ViewController до іншого
ezcoding

Зовсім неправильно. Це буде просто перемотка відразу після запуску.
Лі Проберт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.