【问题标题】:Passing Data Between View Controllers in Swift 4在 Swift 4 中的视图控制器之间传递数据
【发布时间】:2018-12-12 08:06:12
【问题描述】:

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

@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?) 没有运行,我意识到这是因为它不是 Override Func(我认为),但是如果我有 override func 我只能看到你可以通过来自一个的数据?所以第二个 IBAction(按钮 1)将不起作用,因为转到 ViewController 的后退按钮的 Override Func 也会在它应该转到 IPcontroller 时运行,有什么想法吗?

【问题讨论】:

    标签: ios swift viewcontroller


    【解决方案1】:

    您的问题是您的 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
        }
    }
    

    【讨论】:

    • 对 — prepare(for segue: sender:) 必须用该名称覆盖视图控制器的方法。动作方法中的那些甚至在这些方法之外是不可见的。对于您想要覆盖的任何方法,同样如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多