Как выполнить Unwind Segue программно?
С помощью раскадровки это очень просто. Вы просто перетащите действие на "Выход". Но как я должен назвать это из моего кода?
9 ответов
- Создайте ручной переход (ctrl-drag от владельца файла до выхода),
- Выберите его в меню левого контроллера под зеленой кнопкой ВЫХОД.
Вставьте Имя 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, он будет проигнорирован.