Использование раскадровки - это очень просто. Вы просто перетащите действие в "Выход". Но как мне это назвать из моего кода?
Как выполнять Unwind segue программно?
Ответ 1
- Создайте ручной отступ (ctrl -drag from Files Owner to Exit),
- Выберите его в меню левого контроллера под зеленой кнопкой EXIT.
Вставьте имя 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.
3) Выберите segue в виде документа контроллера уровня просмотра раскадровки (он будет указан внизу внизу) и присвойте ему идентификатор.
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.
Просто перетащите элемент управления с оранжевого значка на красный значок выхода, чтобы создать размотку без каких-либо действий/кнопок в представлении.
Затем выберите unwind segue
и установите некоторый идентификатор для доступа к нему из кода.
В коде
[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, он будет проигнорирован.