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

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

Ответ 1

  • Создайте ручной отступ (ctrl -drag from Files Owner to Exit),
  • Выберите его в меню левого контроллера под зеленой кнопкой EXIT.

Choose it in the Left Controller Menu below green EXIT button

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

Затем - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender. с вашим идентификатором segue.

Ответ 2

Здесь полный ответ с Objective C и Swift:

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

// Objective C

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

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

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

enter image description here

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

enter image description here

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

//Цель C

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

//Swift

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

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

Ответ 3

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

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

enter image description here

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

enter image description here

В коде

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

Ответ 4

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

Ответ 5

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

Ссылка на техническую ноту

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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

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

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