在视图控制器之间传输变量而不会出现错误

时间:2017-05-18 14:00:12

标签: ios swift

enter image description here

这是我对视图控制器的确切设置.segue的种类是show.and名称是s1 这是我的代码:

import UIKit

class ViewController: UIViewController {
    var x:String!
    @IBOutlet weak var usr: UITextField!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if(segue.identifier == "s1"){  
            let v = segue.destination as? ViewController222
            v?.ab = usr.text!
        }
    }

    @IBAction func b1(_ sender: UIButton) {
        performSegue(withIdentifier: "s1", sender: nil)
    }
}

对于第二个视图控制器,ViewController222:

import UIKit

class ViewController222: UIViewController {
    var ab:String!

    @IBOutlet weak var l1: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        l1.text=ab
    }
}
有人可以帮忙吗?虽然设置正确,但我的程序崩溃了

3 个答案:

答案 0 :(得分:1)

您不应手动调用performSegue(withIdentifier:sender)。在Interface Builder中添加segue时,也会自动添加一个操作,当您按下segue所连接的按钮时会调用该操作。当您按下按钮时,系统会自动调用prepare(for segue)。

只需删除您的IBAction,它就可以正常工作。

答案 1 :(得分:0)

好的 - 我建议:

  1. 从故事板中删除你的segue ......
  2. 从故事板中删除按钮的IBAction连接......
  3. 从按钮创建新的segue到新的视图控制器......
  4. 将该segue作为“s1”标识符......
  5. 运行你的应用程序,看看你是否不再受到崩溃。

    注意:将IBAction重新分配给按钮。

答案 2 :(得分:0)

你似乎有很多隐含的未包装的选项。比如var ab:String!应该避免。它们只会引起问题,因为它们可能是零,而你却不知道。与展开变量的力相同。这必然导致问题v?.ab = usr.text!。最好的办法是利用if和??解除你的选择权安全。

尝试以下内容。

import UIKit

class ViewController: UIViewController {
    var x: String?
    @IBOutlet weak var usr: UITextField!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if(segue.identifier == "s1"){  
            if let v = segue.destination as? ViewController222 {
                v.ab = usr.text ?? "" 
            }
        }
    }
}

第二课

import UIKit

class ViewController222: UIViewController {
    var ab: String?

    @IBOutlet weak var l1: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        l1.text = ab
    }
}

然后在你的故事板中确保你的segue从按钮拖到ViewController222。