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

3

我在主视图控制器上有一个登录页面,它会将一个名为"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的后退按钮的重写函数也会在它应该前往IPcontroller时运行,有什么想法吗?
1个回答

5
你的问题在于你从未调用prepare方法,因此它们从未执行。
当你调用performSegue时会同时调用prepare(for segue: sender:)方法,所以你可以在ViewController中重写这个方法,并且由于你将identifier作为performSegue方法的参数传递,所以你可以确定如果segue具有thisthis identifier时应该发生什么。
因此,从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)
    }
}

相反,覆盖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
    }
}

1
正确的做法是要重写视图控制器中同名方法的 prepare(for segue: sender:)。在动作方法内部的方法甚至在这些方法之外都不可见。对于想要重写的任何方法也是如此。 - Caleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接