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


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

9 279

9 ответов:

  1. создать ручной переход (ctrl-перетащите из владельца файла для выхода),
  2. выберите его в меню левого контроллера под зеленой кнопкой выхода.

Choose it in the Left Controller Menu below green EXIT button

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

затем,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender. с переходом определить.

вот полный ответ с целью C и Swift:

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

// Objective C

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

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

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

enter image description here

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

enter image description here

4) вызовите unwind segue с помощью этого метода из источник контроллер представления, заменяя расслабиться переходить имя.

/ / Цель C

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

/ / Swift

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

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

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

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

enter image description here

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

enter image description here

в коде

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

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

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

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

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

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

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

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

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

SWIFT 4:

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

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

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

enter image description here

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

enter image description here

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

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

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

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

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

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

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

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

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