2016-05-05 2 views
1

У меня естьКак ГЭТ UIViewController, который представил UINavigationController

NAVIGATIONController A -> ViewController A -> ViewController B 
                | 
                | (modal) 
                | 
               \/
                ' 
             NAVIGATIONController B -> ViewController C 

Как я возвращаюсь к ViewController А от С?

Когда я нахожусь в ViewController C, я пытался напечатать различные значения контроллера:

print(self.navigationController) //NAVIGATIONController B 
print(self.navigationController?.presentingViewController) //UINavigationController (not sure what this is? It is not one of my classes) 
print(self.navigationController?.presentedViewController) //nil 
print(self.presentingViewController) //The same UINavigationController (still not sure...) 
print(self.presentedViewController) //nil 

Я знаю, как вернуться к MyViewController B от MyViewController C, с этой линией self.navigationController?.dismissViewControllerAnimated(true, nil), но я прошу идти от C до A :-)

Как мне получить доступ к тому, что есть до NAVIGATIONController B?

+0

Если вы хотите вернуться из одного контроллера представления к воспроизведенных один, смотрите в использовании «раскручивать перетекает» - это так что вам не нужно кодировать знания вашей иерархии представлений в ViewController C. –

+0

Это только iOS9, мне нужна поддержка iOS8. – Kalzem

+0

Как использовать popToView из Controller C? Я могу только уволить Controller B, но тогда у меня нет контроля, чтобы пойти в A (все это из C). Я не хочу создавать флаг на B, который я установил в true, когда представляю NavController B (и так смотрю C) и проверяя viewDidAppear, если флаг активирован ... Это выглядит нечетко. – Kalzem

ответ

1

UINavigationController от self.navigationController?.presentingViewController должен быть вашим «НАВИГАЦИОННЫЙ КОНТРОЛЬ А».

Что вы должны делать из C, получите «NAVIGATIONController A» с self.navigationController?.presentingViewController и позвоните по номеру popToRootViewController (сделайте это единогласно).

Затем отпустите «ViewController C» (и его навигационный контроллер) с помощью self.navigationController?.dismissViewControllerAnimated(true, nil).

Таким образом, когда «ViewController C» отклоняется, контроллер nav верхнего уровня уже будет показывать «ViewController A».

+0

Спасибо! Он отлично работает :) Вот мой полный код: '(? Self.navigationController .presentingViewController в UINavigationController!) .popToRootViewControllerAnimated (ложь)' ' self.navigationController .dismissViewControllerAnimated (правда, завершение: ноль)?' – Kalzem

0

Вы можете использовать popToViewController.

[self.navigationController popToViewController: yourviewcontroller animated: YES];

Это приведет к появлению контроллеров view, пока не достигнет вашего монитора. Надеюсь, это поможет.

+0

Это Безразлично работа с модалами ... – Kalzem

0

в viewDidLoad BScene в:

override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.noti), name: "popAndDismiss", object: nil) 
} 
func noti() { 
     navigationController?.popViewControllerAnimated(true) 
    } 

в buttonAction CScene в:

@IBAction func click(sender: AnyObject) { 
    NSNotificationCenter.defaultCenter().postNotificationName("popAndDismiss", object: nil, userInfo: nil) 
    navigationController?.dismissViewControllerAnimated(true, completion: nil) 
} 
Смежные вопросы