Как выполнить Unwind Segue программно?

С помощью раскадровки это очень просто. Вы просто перетащите действие на "Выход". Но как я должен назвать это из моего кода?

9 ответов

Решение
  1. Создайте ручной переход (ctrl-drag от владельца файла до выхода),
  2. Выберите его в меню левого контроллера под зеленой кнопкой ВЫХОД.

Выберите его в меню

Вставьте Имя Segue, чтобы расслабиться.

Затем,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender. с твоим результатом идентифицируйся

Вот полный ответ с Objective C и Swift:

1) Создать IBAction раскрутить segue в контроллере представления назначения (где вы хотите перейти). В любом месте в файле реализации.

// Objective C

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

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) На контроллере представления исходного кода (от контроллера, с которым вы работаете), ⌃ + перетащите от "Имя действия", чтобы выйти. Вы должны увидеть последовательность раскрутки, созданную на шаге 1 во всплывающем окне. (Если вы этого не видите, просмотрите первый шаг). Выберите unwindToContainerVC: из всплывающего окна, или как вы называете свой метод, чтобы подключить ваш контроллер источника к разматывать IBAction.

3) Выберите последовательность в наброске документа контроллера исходного представления раскадровки (он будет указан внизу) и присвойте ему идентификатор.

4) Вызовите последовательность раскрутки, используя этот метод, из контроллера представления источника, подставив ваше имя последовательности раскрутки.

// Цель C

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

// Swift

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

NB. Используйте свойство sourceViewController параметра segue в методе unwind для доступа к любым открытым свойствам в контроллере источника. Также обратите внимание, что фреймворк обрабатывает отклонение контроллера источника. Если вы хотите подтвердить это, добавьте метод dealloc в контроллер источника с сообщением журнала, которое должно сработать после его уничтожения. Если Deloc не срабатывает, возможно, у вас есть цикл сохранения.

bradleygriffithОтвет был великолепен. Я сделал шаг 10 и сделал скриншот для упрощения. Это скриншот в Xcode 6.

Просто перетащите Control с оранжевого значка на красный значок выхода, чтобы создать раскрутку без каких-либо действий / кнопок в представлении.

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

Затем выберите unwind segue и установить некоторый идентификатор для доступа к нему из кода.

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

В коде

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

Я использовал [self dismissViewControllerAnimated: YES completion: nil]; который вернет вас к призванию ViewController,

Цитирование текста из Технического примечания Apple по разделу "Перемотка". Чтобы добавить переход "раскручивать", который будет запускаться только программным способом, удерживая нажатой клавишу "Control" + перетащите значок контроллера вида сцены на значок его выхода, затем выберите действие для перемотки нового перехода из всплывающего меню.

Ссылка на техническое примечание

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

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

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

Если вы пропустите этот шаг, строка выше выдаст исключение, что имя seque не известно.

SWIFT 4:

1. Создайте действие @IBAction с segue внутри контроллера, который вы хотите развернуть:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. В раскадровке из контроллера, который вы хотите перейти (развернуть), нажмите Ctrl+drag от знака контроллера, чтобы выйти из знака и выбрать метод, который вы создали ранее:

3. Теперь вы можете заметить, что в структуре документа появилась новая строка с заголовком "Unwind segue....". Теперь вы должны нажать на эту строку и открыть инспектор атрибутов, чтобы установить идентификатор (в моем случае unwindSegueIdentifier).

4. Вы почти закончили! Теперь вам нужно открыть контроллер представления, от которого вы хотите раскрутиться, и создать метод, который будет выполнять переход. Например, вы можете добавить кнопку, связать ее с кодом с помощью @IBAction, после этого внутри этого IBAction добавить метод perfromSegue(withIdentifier:sender:):

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

Так что это все, что вам нужно сделать!

Swift 4.2, Xcode 10+

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

Учитывая, что вы не можете настроить процесс раскрутки программно, самое простое исключительно программное решение - это вызвать:

navigationController?.popToRootViewController(animated: true)

который вернет все контроллеры представления в стеке обратно в ваш корневой контроллер представления.

Обратно совместимое решение, которое будет работать для версий до 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;
        }
    }
}

К вашему сведению: чтобы ответ @Vadim работал с ручным действием обратной связи, вызываемым из View Controller, вы должны поместить команду:

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

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

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

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

Если вы поместите его в другие методы ViewController, такие как viewDidLoad или viewWillAppear, он будет проигнорирован.

Другие вопросы по тегам