(Swift) Развернуть разветвление, когда несколько контроллеров просмотра ведут к одному виду?

Я пытаюсь закодировать игру палача, и у меня проблемы с развязкой. У меня есть несколько контроллеров представлений, которые в конечном итоге приводят к одному и тому же представлению, в котором пользователь играет фактического палача. Однако, в зависимости от контроллера представления, я хочу, чтобы игра находилась в разных режимах (т.е. Многопользовательских, однопользовательских и т.д.). Я пытаюсь добавить кнопку воспроизведения снова, которая отключается до предыдущего контроллера представлений, но я не уверен, как расслабиться, когда есть несколько путей, которые пользователь мог бы получить, чтобы добраться до этого представления.

Другими словами, мой вид приложения идет:

A → B → C или

A → D → C, где C может (идеально) расслабиться до D или B.

Мне было интересно, что лучший способ реализовать это? Должен ли я просто встроить все контроллеры своего вида в контроллеры навигации? Или есть способ представить определенный контроллер представления на основе определенного условия? Спасибо за любую помощь!

Ответ 1

Процесс размотки segue обычно будет определять предыдущий экземпляр UIViewController автоматически. Точный процесс описан в этой Tech Note от Apple, но в целом:

Начиная с контроллера вида, который инициировал разматывание порядок поиска выглядит следующим образом:

  • Следующий контроллер представления в цепочке ответчиков отправляется viewControllerForUnwindSegueAction:fromViewController:withSender:сообщение. Для контроллера представления, представленного модально, это будет который вызывается presentViewController:animated:completion:. В противном случае parentViewController.

    Реализация по умолчанию выполняет поиск приемник childViewControllers для контроллера вида, который хочет для обработки размотки. Если ни один из дочерних представлений получателя контроллеры хотят обрабатывать действие разматывания, приемник проверяет хочет ли он обработать действие разматывания и возвращает себя, если он делает. В обоих случаях Метод canPerformUnwindSegueAction:fromViewController:withSender:используется, чтобы определить, хочет ли данный контроллер представления обрабатывать отмените действие.

  • Если контроллер просмотра не возвращается viewControllerForUnwindSegueAction:fromViewController:withSender: в шаг 1, поиск повторяется с следующего контроллера представления в цепочку ответчиков.

Таким образом, точный процесс будет зависеть от того, как вы представили контроллер представления C - например, посредством модального представления segue или push-segue на UINavigationController, но до тех пор, пока оба B и D реализуют действие разматывания, вы должны быть хорошо.

Ответ 2

Если у вас есть какая-либо пользовательская логика и вы хотите программно вызывать размотку segue различным контроллерам представлений, вот как это сделать:

  • Добавьте unwindFromCViewController в оба BViewController и DBViewController:

    BViewController.swift

    class BViewController : UIViewController {
        @IBAction func unwindFromCViewController(segue:UIStoryboardSegue) {
        }
    }
    

    DViewController.swift

    class DViewController : UIViewController {
        @IBAction func unwindFromCViewController(segue:UIStoryboardSegue) {
        }
    }
    
  • В своем раскадровке создайте этот сеанс и дайте ему идентификатор и привяжите его к действию, которое вы определили выше unwindFromCViewController:

        введите описание изображения здесь

        введите описание изображения здесь

  1. Вызвать разворот из кода:

    self.performSegueWithIdentifier("unwindFromCViewControllerSugueId", sender: self)
    

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

Ответ 3

Я бы просто позвонил в код popViewController:animated, чтобы перейти к контроллеру представления, если вы нажали его в стек навигации, или dismissViewController:animated, если он был представлен модально.