2016-04-24 4 views
0

У меня есть NavigationController, что следующие VC встроены в: VC1 -> VC2 -> VC3 -> VC4 -> VC5. Моя проблема заключается в том, что когда я перехожу из VC5 (после завершения редактирования), я отправляю вас обратно в VC3, но я хочу программно выбросить VC4 и VC5 из стека, то есть когда пользователь отправляется обратно в VC3, я хочу «вернуться "в navagitionBar, чтобы отвезти вас в VC2 (а не VC5, откуда вы действительно пришли).Программно определяя порядок/стек нового контроллера навигации?

Это очень много в IOS, где вы хотите отредактировать модель, а затем отправить их обратно в представление tableView/Collection, но, поскольку редактирование выполнено, вы не хотите, чтобы редактирование viewControllers в стеке навигации больше так как он слишком запутывает UX.

На скриншоте ниже, ВК в правом верхнем углу является VC5: enter image description here который segued обратно в PinViewController (VC3) через self.performSegueWithIdentifier("backToPins", sender: self)

Как я могу это сделать?

+0

Вы просто использовать разматывания SEGUE. Определите метод разматывания в VC3, и магия управляется для вас – Paulw11

+0

Спасибо @ Paulw11 unindForSegue приведет меня к VC3, но мне нужно, чтобы VC3 обновлялся с новыми данными модели, которые были добавлены в VC5, поэтому я не уверен отключение к предыдущему экземпляру VC3 лучше всего здесь, мне кажется, мне нужен новый экземпляр с обновленными данными модели? – GarySabo

+0

Вы можете передавать данные обратно через разматывание; метод 'unwind' получает' UIstoryboardSegue', который имеет 'sourceViewController', который вы можете использовать так же, как' destinationViewController' в 'prepareFoeSegue' – Paulw11

ответ

1

не использовать segue вернуться (поп).

вы должны использовать popToViewController и передать конкретный viewcontroller в качестве аргумента для pop, который контролирует viewcontroller.

например, если вы хотите перейти на контроллер 3-го уровня из пяти, вы можете сделать что-то вроде ниже. вы можете просто изменить индекс из массива viewcontroller, чтобы перейти на другой контроллер представления.

let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]; 
self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true); 

Если вы используете SEGUE это означает, что вы добавляете (толчок) новый ViewController к навигации стека. в вашем примере ваш стек после достижения 5-й вид, как,

VC1 - VC2 - VC3 - VC4 - VC5 (top of stack)

теперь, если вы performsegue вернуться к VC3 затем стек должен быть таким,

VC1 - VC2 - VC3 - VC4 - VC5 - VC3(top of stack)

и если вы поп к VC3, то ваш стек, как,

VC1 - VC2 - VC3 (top of stack).

так поп viewcintrollers, чтобы вернуться, не используйте segue

надеюсь, что это поможет :)

+0

Спасибо! Может ли prepareForSegue вызвать popToViewController? Мне нужно передать var обратно в VC3 .... – GarySabo

+0

no prepareforsegue не вызывается на poptoviewcontroller. вы можете использовать протокол и делегат для передачи данных назад. Google переводит данные обратно в viewcontroller, вы получите много ссылок. :) – Lion

1

Лучший способ сделать это через размотки Segue.

В VC3 можно определить соответствующую функцию разматывания:

@IBAction func unwind(segue:UIStoryboardSegue) { 
    if let sourceViewController = segue.sourceViewController as? VC5 { 
     let myNewData=sourceViewController.someProperty 
     self.someFunctionThatUpdatesScene() 
} 

Тогда в VC5 сцены вы можете создать разматывания SEGUE в одном из двух способов.

Если вы хотите, чтобы запускаться непосредственно из объекта, например, UIButton, вы перетаскивать из action в инспекторе на значок exit в верхней части сцены и выберите unwind из всплывающего окна.

Если вы хотите запрограммировать разматывание программно, перетащите из объекта контроллера вида в проводнике слева на значок выхода и выберите unwind из всплывающего окна.Теперь вы увидите разворот segue в проводнике, и вы можете дать ему идентификатор, как вы бы с любым segue. Вы можете использовать этот идентификатор с performSegueWithIdentifier

Преимущество этого подхода в том, что вам не нужно делать какие-либо предположения относительно глубины стека UINavigationController, и вам не нужно реализовывать делегирование/протокол для передачи данных обратно.

Apple, имеет очень хорошую Tech Примечание о Using Unwind Segues

+0

Спасибо @ Paulw11 проблема, с которой я сталкиваюсь с unind segue, - это 'someFunctionThatUpdatesScene()' VC - это контроллер коллекции и перезагрузка, недействительный макет не работает. Вы отправляетесь обратно в точные ячейки, которые были на экране, когда вы уходили. Мне, по сути, нужно «обновить» весь collectionViewController, но я не смог выяснить, возможно ли это. – GarySabo

+0

Почему бы и нет? Функция размотки находится в VC3, и вы знаете, какую ячейку вы редактировали (вы можете сохранить свойство, которое сообщает вам, что если вам нужно), поэтому тривиально обращаться к данным из экземпляра VC5 и перезагружать соответствующие ячейки (я) – Paulw11

+0

Это немного больше связано ... ячейки в VC3 были заполнены через асинхронный сетевой вызов, затем VC5 удаляет и заменяет данные и отправляет их в сеть ... поэтому я не просто редактирую локальные данные, мне нужен VC3 для сделать новый сетевой вызов внутри unindSegue, чтобы получить обновленные данные, а затем перезагрузить collectionView ... который я не смог получить. – GarySabo