简体   繁体   English

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

[英]Passing Data Between View Controllers in Swift 4

I've got a login page on the main View Controller which passes a "verified" string to EslViewController , this, I can get to work, but it's now when I want to pass this "verified" to IP_ModuleViewController that I'm having issues with... the code at the moment is; 我在主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
    }
}

Now, my problem is that the func prepare(for segue: UIStoryboardSegue, sender: Any?) isn't running, I realize that this is because it's not an Override Func (I think), but if I have the override func instead I can only see that you can pass data from one? 现在,我的问题是func prepare(for segue: UIStoryboardSegue, sender: Any?)没有运行,我意识到这是因为它不是Override Func(我认为),但如果我有覆盖功能而不是我只能看到你可以从一个传递数据? so the second IBAction (button 1) won't work because the Override Func for the back button which goes to ViewController also runs when it's meant to be going to IPcontroller , Any ideas? 因此,第二个IBAction(按钮1)将无法工作,因为返回到ViewController的后退按钮的覆盖功能也会在它意图转到IPcontroller ,任何想法?

Your problem is that your prepare methods never run because you never call them. 您的问题是您的prepare方法永远不会运行,因为您从未调用它们。

Look, when you call performSegue , then prepare(for segue: sender:) is called too, so you can override this method in your ViewController and because you're passing identifier as parameter of performSegue method you can determine what should happen if segue has this or this identifier 看,当你调用performSegue ,那么也会调用prepare(for segue: sender:) ,所以你可以在ViewController中覆盖这个方法,因为你将identifier作为performSegue方法的参数传递,你可以确定如果segue有什么应该发生这个这个 identifier

So, delete prepare for segue methods from IBActions 因此,从IBActions删除准备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)
    }
}

instead override prepare(for segue: sender:) method of ViewController and inside specify what should happen if segue has "main/login" indentifier or "Button1" : 而是覆盖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
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM