不同的ViewController Segue

时间:2019-02-25 02:50:22

标签: ios swift segue

我希望我的应用程序可以“自动”从ViewControll A到b,以及b到c(a,b,c是独立的viewcontroller)进行选择,所以我做到了:

  1. 在A_ViewController上定义了一个计时器,可以每隔一分钟从A到B到C进行计时。

  2. 在故事板上设置ViewController A和B的位置:

    A_ViewController:'goToB'和'goToC'

    B_ViewController:'goToC'

  3. ,并在A_ViewController中覆盖“覆盖func prepare(for segue:.....”)。

代码:

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)
    }
}

运行APP后,可以先进行设置(成功显示ViewController B),但是此后,它始终显示错误消息,如下所示:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'接收器()没有标识为'goToC'的序列

但是我真的在storyBoard上设置了一个segue“ goToC”。我不知道如何解决。我已经从Google搜索中修改了代码。

1 个答案:

答案 0 :(得分:0)

您说B_Controller().goToC()是创建B_Controller新实例,不是指goToB创建的现有实例。塞古。此外,由于不是从情节提要中创建新的B_Controller实例,因此它对segues一无所知。

您需要存储对要在属性中显示的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中使用一个计时器,可能会更清洁。