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

Passing Data Between View Controllers in Swift 4

我在主 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
    }
}

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

您的问题是您的 prepare 方法从不 运行 因为您从不调用它们。

看,当您调用 performSegue 时,也会调用 prepare(for segue: sender:),因此您可以在 ViewController 中覆盖此方法,因为您正在传递 identifier作为 performSegue 方法的参数,您可以确定如果 segue 具有 thisthis identifier [=22= 会发生什么]

因此,从 IBActions

中删除 prepare for segue 方法
@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)
    }
}

而是重写 ViewController 的 prepare(for segue: sender:) 方法,并在内部指定如果 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
    }
}