在Swift 4中在视图控制器之间传递数据

Tay*_*les 3 viewcontroller ios swift

我在main上有一个登录页面,View Controller它传递了一个"verified"字符串EslViewController,这个,我可以开始工作了,但现在我想把它传递"verified"IP_ModuleViewController我有问题...目前的代码是;

@IBAction func backButton(_ sender: Any) {
    if installer == "verified"{
        performSegue(withIdentifier: "main/login", sender: self)
    }
        func prepare(for segue: UIStoryboardSegue, sender: Any?){
            let mainController = segue.destination as! ViewController
            mainController.myvar = installer
    }
}

@IBAction func button1(_ sender: Any) {
    if installer == "verified"{
        performSegue(withIdentifier: "Button1", sender: self)
    }
    func prepare(for segue: UIStoryboardSegue, sender: Any?){
        let IPController = segue.destination as! IP_ModuleQuickStartViewController
        IPController.verified = installer
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是它func prepare(for segue: UIStoryboardSegue, sender: Any?)没有运行,我意识到这是因为它不是Override Func(我认为),但是如果我有覆盖功能而我只能看到你可以从一个传递数据?所以第二个IBAction(按钮1)将不起作用,因为后退按钮的覆盖功能ViewController也会在它意图进行时运行IPcontroller,任何想法?

Rob*_*ler 5

您的问题是您的prepare方法永远不会运行,因为您从未调用它们.

看,当你调用时performSegue,prepare(for segue: sender:)也会调用,所以你可以在ViewController中覆盖这个方法,因为你identifier作为performSegue方法的参数传递,你可以确定如果segue有这个这个会发生什么 identifier

所以,删除准备segue方法 IBActions

@IBAction func backButton(_ sender: Any) {
    if installer == "verified"{
        performSegue(withIdentifier: "main/login", sender: self)
    }
}

@IBAction func button1(_ sender: Any) {
    if installer == "verified"{
        performSegue(withIdentifier: "Button1", sender: self)
    }
}
Run Code Online (Sandbox Code Playgroud)

改为覆盖prepare(for segue: sender:)ViewController的方法,并在内部指定如果segue具有"main/login"标识符或应该发生什么"Button1":

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "main/login" {
        let mainController = segue.destination as! ViewController
        mainController.myvar = installer
    } else if segue.identifier == "Button1"
        let IPController = segue.destination as! IP_ModuleQuickStartViewController
        IPController.verified = installer
    }
}
Run Code Online (Sandbox Code Playgroud)