Используя раскадровку, это очень просто. Вы просто перетаскиваете действие на «Выход». Но как мне вызвать это из моего кода?
Как программно выполнить переход Unwind?
Ответы (10)
- Создайте переход вручную (ctrl -drag от владельца файла до выхода),
- Выберите его в меню левого контроллера под зеленой кнопкой ВЫХОД.
Вставьте название перехода, чтобы расслабиться.
Затем - (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) На контроллере исходного представления (контроллер, от которого вы переходите), ⌃ + перетащите из «Имя действия», чтобы выйти. Вы должны увидеть во всплывающем окне последовательность размотки, созданную на шаге 1. (Если вы его не видите, повторите шаг 1). Выберите unwindToContainerVC: из всплывающего окна или как вы назвали свой метод для подключения исходного контроллера к IBAction раскрутки.
3) Выберите переход в схеме документа контроллера исходного представления раскадровки (он будет указан внизу) и присвойте ему идентификатор.
4) Вызовите переход размотки, используя этот метод из контроллера представления source, подставив свое имя перехода.
// Цель C
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Быстрый
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB. Используйте свойство sourceViewController параметра segue в методе unwind для доступа к любым открытым свойствам исходного контроллера. Также обратите внимание, что фреймворк обрабатывает отключение исходного контроллера. Если вы хотите подтвердить это, добавьте к исходному контроллеру метод dealloc с сообщением журнала, которое должно срабатывать после его уничтожения. Если dealloc не срабатывает, у вас может быть цикл сохранения.
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
- person xhg; 09.02.2015
ctrl+drag
от ViewController
до Exit
, была невероятно полезной. Спасибо!
- person kbpontius; 14.08.2015
bradleygriffith
ответ был отличным. Я сделал шаг 10 и сделал снимок экрана для упрощения. Это снимок экрана в Xcode 6.
- Удерживая нажатой клавишу «Control», перетащите от оранжевого значка к красному значку «Выход», чтобы создать раскрутку без каких-либо действий / кнопок в представлении.
- Затем выберите
unwind segue
на боковой панели:
- Задайте строку идентификатора перехода:
- Доступ к этому идентификатору из кода:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
. Тогда ваше решение будет работать
- person Alex Cio; 16.10.2014
Я использовал [self dismissViewControllerAnimated: YES completion: nil];
, который вернет вас к вызывающему ViewController
.
Цитата из Технического примечания Apple о переходе по разворачиванию: чтобы добавить переход раскрутки, который будет запускаться только программно, удерживайте Ctrl + перетаскивание от значка контроллера представления сцены к его значку выхода, затем выберите действие раскрутки для нового перехода во всплывающем меню.
Ссылка на техническое примечание
Ответ Вишала Чаудри выше работал у меня. Я бы также добавил, что для ручного запуска seque с помощью:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
из ViewController вы также должны выбрать последовательность разматывания в Scene ViewController в раскадровке и в представлении свойств на RHS, чтобы поле Indentifier содержало имя, на которое вы ссылаетесь в коде («mySegueName» в приведенном выше примере ).
Если вы пропустите этот шаг, строка выше выдаст исключение о том, что имя последовательности неизвестно.
Решение с обратной совместимостью, которое будет работать для версий до 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 с внутренним контроллером, на который вы хотите расслабиться:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. В раскадровке, от контроллера, который вы хотите выйти (раскрутить), от Ctrl + перетащите от значка контроллера до знака выхода и выберите метод, который вы создали ранее:
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+
Для тех, кто задается вопросом, как это сделать с венчурными капиталистами, не настроенными с помощью раскадровки (те, кто ответят на этот вопрос, выполнив поиск "программно" + "развернуть переход").
Учитывая, что вы не можете программно настроить завершающий переход, простейшим исключительно программным решением является вызов:
navigationController?.popToRootViewController(animated: true)
который вернет все контроллеры представления в стеке к корневому контроллеру представления.
Чтобы извлечь только самый верхний контроллер представления из стека навигации, используйте:
navigationController?.popViewController(animated: true)
К вашему сведению: для того, чтобы ответ @Vadim работал с действием ручной раскрутки seque, вызываемым из контроллера представления, вы должны поместить команду:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
внутри метода переопределенного класса viewDidAppear вот так:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Если вы поместите его в другие методы ViewController, такие как viewDidLoad или viewWillAppear, он будет проигнорирован.
performSegueWithIdentfier
делает именно это: выполнение перехода от одного ViewController к другому
- person ezcoding; 28.09.2016