如何通过2个视图控制器传递textfield.text数据

时间:2019-07-08 23:30:57

标签: ios swift xcode firebase segue

当用户在ViewController中将两个文本字段都以textField.text形式输入到我的第3个视图控制器时,我试图将这两个文本字段(passName和passPhone)传递给我的第3个视图控制器,因为我需要它来引用Firebase数据库子名称,但是每次运行它给我零返回值?我不明白为什么值没有通过

performSegue应该将textfield.text传递给下一个视图控制器,因为在重写功能中,我设置了它

错误代码:(在代码中查找位置)

线程1:致命错误:在隐式展开一个可选值时意外发现nil

// ViewController

@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var numberField: UITextField!
@IBAction func linkTapped(_ sender: Any) {
    if (nameField.text != nil && numberField.text != nil) {
         if error != nil {
                   //code
                } else {
                    self.performSegue(withIdentifier: "code", sender: self) 
                }
            }
        }

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = verificationCodeViewController()
    vc.passName = self.nameField.text
    vc.passPhone = self.numberField.text
    nameField.endEditing(true)
    numberField.endEditing(true)
}

// VerificationCodeViewController

var passName: String!
var passPhone: String!

@IBAction func Login(_ sender: Any) {
    if (code.text! != "") {
        let defaults = UserDefaults.standard
        let credential: PhoneAuthCredential = PhoneAuthProvider.provider().credential(withVerificationID: defaults.string(forKey: "authVID")!, verificationCode: code.text!)
        Auth.auth().signIn(with: credential) { (user, error) in
            if error != nil {
                print("error: \(String(describing: error?.localizedDescription))")
            } else {
                print("Phone Number: \(String(describing: user?.user.phoneNumber))")
                let userInfo = user?.user.providerData[0]
                print("Provider ID: \(String(describing: userInfo?.providerID))")
                self.performSegue(withIdentifier: "logged", sender: Any?.self)
            }
        }
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = RankedClubScreen()
    vc.passName = self.passName
    vc.passPhone = self.passPhone
}

// RankedClubScreen-ViewController

var passName: String!
var passPhone: String!

@IBAction func signOutFunction(_ sender: Any) {
    do {
        try Auth.auth().signOut()
        let ref = Database.database().reference().child("Online Users")
        print(self.passName + self.passPhone) // Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
        ref.child(self.passName + self.passPhone).removeValue()

        self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)
    } catch let error {
        print("not signed in...", error)
    }
}

1 个答案:

答案 0 :(得分:2)

您的问题是创建新的vc,而不是在此处使用segue目标

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  let vc = VerificationCodeViewController()

在这里

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   let vc = RankedClubScreen()

所以让它写成

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  let vc = segue.destination as! VerificationCodeViewController
  vc.//// set this 

让其他segue也做


enter image description here