2016-05-16 4 views
-5

Итак, у меня есть контроллер навигации. есть сегмент от контроллера Root View до другого контроллера View.Получение доступа к текущему контроллеру просмотра в стеке навигации

Когда я хочу получить доступ к другому контроллеру просмотра, я переопределяю метод prepareForSegue и пользуюсь destinationViewController.

Но это не нормально для меня. Все мои вещи в prepareForSegue будут выполняться каждый раз, когда вызывается segue, но я не хочу этого. Во-вторых, он разрушает логику моего кода: после performSegueWithIdentifier (фактически до) выполнение перескакивает в другое место в коде.

Было бы здорово, если бы я мог получить доступ к другому диспетчеру просмотра, например, я сделал это с Root ViewController - например, по ключевому слову self.

Вот пример кода, чтобы сделать мой вопрос более четко:

func startWorking() { 
    /*here we made some stuff for current VC 
... 
... 
*/ 

    //next we go to new View Controller 
    performSegueWithIdentifier("newVC", sender: nil) 

    //then all actions that I want to do begin at another method - prepareForSegue 
    //But I want get access to View Controller that user sees now! 
    //For example present some view: 

    let someView = UIView(frame: someFrame) 
    /*question subject*/.view.addSubview(somView) 
    } 

/вопрос подлежит/- ток ViewController, что я представил Segue и точкой моего вопроса.

+1

* "Все мои вещи в prepareForSegue будет выполняться каждый раз, когда переход называется , но я не хочу этого "* - тогда не помещайте его туда ... У меня проблемы с пониманием, что именно ваша проблема, может показать какой-то код, демонстрирующий вашу проблему? – luk2302

+1

Контроллер навигации имеет три метода доступа к элементам в стеке навигации. Вы пробовали кого-нибудь из них, чтобы посмотреть, работают ли они на вас? – Desdenova

+0

Да! Это мой вопрос! Я представляю новый контроллер Segue, означает ли это, что я должен делать все, что я хочу сделать с новым контроллером в методе prepareForSegue? –

ответ

3

Сергей Гамаюнов,

Вы всегда можете получить доступ к верхнему mostViewController навигации стека, используя,

let viewCOntroller = self.navigationController?.topViewController 

EDIT

Я считаю, что если вы не можете получить вашу логику вокруг prepareForSegue или самостоятельно .navigationController? .topViewController вы должны заглянуть в свой шаблон дизайна :)

Это, как говорится, я понимаю все, что вам нужно сделать, это получить доступ к ViewController после performSegue без использования prepareForSegue, вы можете использовать этот код

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController is YourDestinationViewControllerClass { 
      print("You have access to viewController loaded do whatever you want") 
     } 
} 

Функция указано выше, является навигационный контроллер делегата :) Таким образом, вы должны объявите свой viewController для подтверждения UINavigationControllerDelegate. как

class ViewController: UIViewController,UINavigationControllerDelegate 

и

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.navigationController?.delegate = self 
} 

Thats это вы хорошо идти :) Счастливый приятель кодирования :)

+0

Я пытался использовать 'topViewController' свойство: ' performSegueWithIdentifier ("NewVCSegue", отправителе: автономный)? пусть newVC = self.navigationController .topViewController' Но 'newVC' на самом деле VC, откуда я пришел ... –

+0

@ sergey-gamayunov: Я считаю, что вы очень смущены :) Лемм поможет вам :) Подготовка к segue используется для подготовки destinationViewController еще до его представления или загрузки в стек навигации :) Итак, если вы хотите настроить viewCOntroller еще до его рендеринга вы должны использовать segue.destinationViewController для подготовки к Segue :) С другой стороны, предположим, что ваш контроллер просмотра уже загружен и является topViewController в стеке навигации, вы можете использовать self.navigationController? .topViewController. Этот метод даст вам доступ к существующему экземпляру –

+0

Спасибо за ответ! Но в этом примере кода я не использовал 'prepareForSegue', я использовал' performSegueWithIdentifier', который должен загрузить destinationVC сверху в стеке навигации ... –

Смежные вопросы