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

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

9 ответов


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

Choose it in the Left Controller Menu below green EXIT button

введите имя Segue для того чтобы размотать.

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


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

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

// Objective C

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

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

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

enter image description here

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

enter image description here

4) вызовите unwind segue с помощью этого метода из источник View controller, подставляя ваш 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 вы также должны выбрать сегмент размотки под сценой 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:отправитель:) способ:

     @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 это будет проигнорировано.