2014-02-06 2 views
2

У меня есть процесс регистрации пользователя, который разделяется на 3 экрана. На первом экране пользователь должен ввести свой номер мобильного телефона, второй экран просит его выбрать его местоположение. & Третий экран просит его ввести свой день рождения и несколько других деталей.iOS: Откиньтесь назад в цепочке модальных сегментов

Таким образом, всего 3 контроллера, которые я использовал и которые представлены в следующем порядке.

1) mobile_number_controller.rb 2) location_controller.rb 3) miscellaneous_details_controller.rb

Так что я представить это как цепь контроллеров с использованием всех видов транспорта перетекает в результате обсуждения here. Прямо сейчас я немного растерялся, чтобы отпрянуть назад. Вопросы, которые я имею в виду, являются

1) Можно ли отдохнуть на контроллер вверх в цепи, представляющие контроллеры, но не контроллер, который непосредственно представлен текущий контроллер, т.е. от miscellaneous_details_controller к mobile_number_controller ? Если это возможно, это правильный способ сделать это?

2) Если возможно 1), то что произойдет с другими контроллерами цепи, то есть всеми контроллерами между текущим контроллером и контроллером представления вверх в цепочке, к которой мы сейчас отматываем, т. Е. location_controller? Должен ли я вручную отключать все контроллеры один за другим и где я это делаю?

Пожалуйста, предложите правильные способы решения этой проблемы. Любая помощь будет очень полезной, поскольку я только начинаю с разработки iOS.

+0

Ответ на вопрос 1: да, и любой хороший учебник по разучиванию Segue проведет вас именно так, как это сделать. – nhgrif

+0

Как-то я знал, что этот вопрос придет! :) – matt

+0

:) Вы упомянули это там, правильно ?! – Sunil

ответ

2

Самый простой способ - не использовать разматывать сеанс вообще. Просто позвоните dismissViewControllerAnimated:completion:, отправив на экземпляр контроллера вида, который вы хотите вернуть обратно до. Это приведет к тому, что все представленные контроллеры представлений будут удалены полностью назад к тому, к которому вы его отправили.

Вы можете выяснить, какой контроллер просмотра это потому, что есть целая цепь объектов , идущих полностью назад. Другими словами, чтобы вернуться на один шаг, вы говорите:

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

Для перехода на два шага назад, вы говорите:

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 
+0

Спасибо! Но у меня есть небольшое сомнение. Когда я разматываю презентационный контроллер, я могу реализовать метод типа действия IB (с развязкой в ​​качестве аргумента) в контроллере представления, который является целевым действием после выполнения segue. Может быть что-то подобное сделано при вызове функции rejectViewControllerAnimated: завершение? Или мне нужно сделать условную проверку, чтобы что-то сделать в представлении viewDidAppear: делегирование контроллера представления? – Sunil

+0

Unwind segues - последнее дополнение к раскадровки и вовсе не нужно. До того, как они существовали, у нас всегда была кнопка с действием IB, где мы сами называли 'rejectViewController'. Unwind segues ничего не делают для вас, что вы не можете сделать сами, и в вашей ситуации, хотя их, безусловно, можно заставить работать (они блестяще умны), я предлагаю, чтобы это проще было удалить вручную, по-старому. Знание *, которое * vc, чтобы уволить, зависит от вас, конечно, но это было бы так же верно по-другому. – matt

+0

Хорошо, понял. Спасибо за всю помощь :) – Sunil

0

Я решил это с помощью контроллеров представлений ребенка. Для первого контроллера представления вы показываете, представить его в обычном порядке:

self.presentViewController(myViewController, animated: true, completion: nil) 

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

addChildViewController(childViewController) 
view.addSubview(childViewController.view) 
childViewController.view.frame = view.bounds 

let startTransform = CGAffineTransformMakeTranslation(0, CGRectGetMaxY(view.bounds)) 
childViewController.view.transform = startTransform 

UIView.animateWithDuration(0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .BeginFromCurrentState, animations: { 
     childViewController.view.transform = CGAffineTransformIdentity 
     }, completion: { (_) in 
      //I wanted to change my status bar color here, do whatever you need 
      UIApplication.sharedApplication().setStatusBarStyle(.Default, animated: true) 
    }) 

Теперь, если вы хотите, чтобы закрыть всю вещь, вы просто звоните:

self.dismissViewControllerAnimated(true, completion: nil) 

И если вы хотите, чтобы закрыть только childViewController вы повторно активируете контроллер вида назад, а затем удалите его:

childViewController.view.transform = CGAffineTransformIdentity 

UIView.animateWithDuration(0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .BeginFromCurrentState, animations: { 
    let endTransform = CGAffineTransformMakeTranslation(0, CGRectGetMaxY(self.view.bounds)) 
    childViewController.view.transform = endTransform 
    }, completion: { (_) in 
     //remove child view controller 
     childViewController.removeFromParentViewController() 
     childViewController.view.removeFromSuperview() 
})