другой viewcontroller segue - PullRequest
       11

другой viewcontroller segue

0 голосов
/ 25 февраля 2019

Я хочу, чтобы мое приложение могло «автоматически» переходить от ViewControll A к b и b к c (a, b, c - независимый viewcontroller), поэтому я сделал:

  1. определил таймер на A_ViewController, может переходить от A к B к C каждую минуту.

  2. установить переход на storyBoard для ViewController A и B:

    A_ViewController:'goToB' и 'goToC'

    B_ViewController: 'goToC'

  3. и перезаписать "функцию перезаписи подготовки (для перехода: ....." в A_ViewController.

Код:

class A_ViewController:  ViewController {

    ...//in Timer
       //first 1 minute
       performSegueWithIdentifier("goToB", sender: self)
       //second minute
       B_Controller(). goToC()
    ...

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToB" {
            let B_Controller = segue.destination as! B_ViewController
            B_ViewController.msg = "From AtoB"
        }
        if segue.identifier == "goToSearchLocation" {
            let C_ViewController = segue.destination as! C_ViewController
            C_ViewController.msg = searchWord
            }
    }

class B_Controller:  ViewController {
    ...
    func goToC() {
       performSegueWithIdentifier("goToC", sender: self)
    }
}

После запуска приложения можно выполнить первый переход (успешно показать ViewController B), но после этого всегда отображается сообщение об ошибке, как показано ниже:

Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Receiver () не имеет перехода с идентификатором« goToC »'

Но я действительно установил переход'goToC 'на storyBoard. Я не знаю, как это исправить. Код уже изменен из поиска Google.

1 Ответ

0 голосов
/ 25 февраля 2019

Когда вы говорите B_Controller().goToC(), вы создаете новый экземпляр из B_Controller, вы не ссылаетесь на существующий экземпляр, который был создан с помощью сеанса goToB.Кроме того, поскольку ваш новый экземпляр B_Controller не создается из раскадровки, он ничего не знает о сегментах.

Вам необходимо сохранить ссылку на экземпляр B_Controller, которым вы являетесьпредставляя в собственности.Затем вы можете использовать это свойство для вызова функции goToC.

class A_ViewController:  ViewController {

    var bController: B_Controller?

    ...//in Timer
       //first 1 minute
       performSegueWithIdentifier("goToB", sender: self)
       //second minute
       self.bController?.goToC()
    ...

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToB" {
            self.bController = segue.destination as! B_ViewController
            self.bController.msg = "From AtoB"
        }
        if segue.identifier == "goToSearchLocation" {
            let C_ViewController = segue.destination as! C_ViewController
            C_ViewController.msg = searchWord
            }
    }

class B_Controller:  ViewController {
    ...
    func goToC() {
       performSegueWithIdentifier("goToC", sender: self)
    }
}

Возможно, вы захотите изменить дизайн своего кода;Вероятно, было бы чище иметь новый таймер в B, который представляет C, а не пытаться использовать один таймер в A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...