【问题标题】:I'm not able to pass a value to the next ViewController我无法将值传递给下一个 ViewController
【发布时间】:2020-04-13 02:59:06
【问题描述】:

我正在开发这个对 Firebase 运行 2 个不同查询的应用。第一个 Firebase 查询显示 pickerView 中的数据,第二个是对“用户”集合的查询并提取一个自定义字段。两个查询都按预期工作,pickerView 显示信息,我可以将用户集合的结果打印到控制台。我遇到的问题是我正在尝试将自定义字段的值传递给下一个 VC 并且不起作用。我不确定我错过了什么。任何帮助是极大的赞赏。这是我的代码:

       class PatfilterVC: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

    @IBOutlet weak var hospNameTxt: UITextField!
    @IBOutlet weak var getDataBtn: UIButton!
    @IBOutlet weak var infoPickerViewer: UIPickerView!

    private var textFieldSelected = UITextField()
    private var pickerView: UIPickerView?
    private var handle: AuthStateDidChangeListenerHandle?
    private var userListener: ListenerRegistration!

    private var hospitalClass = [HospitalList]()
    private var hospCollectionRef: CollectionReference!
    private var hospCode: HospitalList! = nil

    private var loggedInUserClass = [UserSpecialty]()
    private var usersCollectionRef: CollectionReference!
    private var currentUserSpecialty: UserSpecialty! = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        overrideUserInterfaceStyle = .light

        let pickerView = UIPickerView()
        infoPickerViewer.delegate = self
        infoPickerViewer.dataSource = self

        hospNameTxt.inputView = pickerView
        hospNameTxt.delegate = self

        self.infoPickerViewer = pickerView
        self.infoPickerViewer?.delegate = self
        self.infoPickerViewer?.dataSource = self

        self.infoPickerViewer?.reloadAllComponents()

        hospCollectionRef = Firestore.firestore().collection(HOSPITAL_REF)
        usersCollectionRef = Firestore.firestore().collection(USERS_REF)

        handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
             if user == nil {
                self.getDataBtn.isUserInteractionEnabled = false
                self.infoPickerViewer.isUserInteractionEnabled = false
             } else {
                 self.getDataBtn.isUserInteractionEnabled = true
                self.infoPickerViewer.isUserInteractionEnabled = true
                 self.setListener()
             }
         })

        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIInputViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)

        getHospitalList()
        getUserSpecialty()

    }


    @objc func dismissKeyboard() {
        view.endEditing(true)
    }

    override func viewWillAppear(_ animated: Bool) {
        handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
            if user == nil {

                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                let LoginVC = storyboard.instantiateViewController(withIdentifier: "LoginVC")
                self.present(LoginVC, animated: true, completion: nil)
            } else {
                self.setListener()
            }
        })
    }

    override func viewWillDisappear(_ animated: Bool) {
        if userListener != nil {
            userListener.remove()
        }
    }

    func setListener() {
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        textFieldSelected = textField
    }

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        self.pickerView?.reloadAllComponents()
        return true
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return hospitalClass.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
            return hospitalClass[row].hospitalName
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            hospCode = hospitalClass[row]
            let hosp = hospitalClass[row].hospitalName
            hospNameTxt.text = hosp
    }

    @IBAction func getDataTapped(_ sender: Any) {
        guard hospCode != nil else {return}
        guard currentUserSpecialty != nil else {return}

        performSegue(withIdentifier: "goToResults", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToResults" {
            let vc = segue.destination as! ResultsdataVC
            if let hosp = hospCode {
                vc.hospCodeFromVC = hosp.hospitalCode
            }
            if let user = currentUserSpecialty {
                vc.userSpecFromVC = user.userSpecialtyCode
            }
        }
    }

    //this query displays in the pickerView

    func getHospitalList() {
        let hospListQuery = hospCollectionRef?
            .order(by: HOSPITAL_NAME, descending: false)

        hospListQuery?.getDocuments { (snapshot, error) in
            if let err = error {
                debugPrint("error fetching docs: \(err)")
            } else {
                self.infoPickerViewer.reloadAllComponents()
                let snap = snapshot
                for document in snap!.documents {
                    let data = document.data()
                    let hospitalCode = data[HOSPITAL_CODE] as? String ?? ""
                    let hospitalName = data[HOSPITAL_NAME] as? String ?? ""

                    let hospList = HospitalList(hospitalCode: hospitalCode, hospitalName: hospitalName)

                    self.hospitalClass.append(hospList)
                }

            }
        }
    }

    //this query gets the values from Firebase but i cannot pass userSpecialtyCode
    // to the next viewController

    func getUserSpecialty() {
        if let loggedInUser = Auth.auth().currentUser?.uid {
            let docRef = usersCollectionRef.document(loggedInUser)
            docRef.getDocument { ( document, error) in
                if let document = document, document.exists {
                    let data = document.data()
                    let userSpecialtyCode = data?[SPECIALTY_CODE] as? String ?? ""
                    let loggedInUserId = data?[LOGGED_IN_USER_ID] as? String ?? ""

                    let loggedUser = UserSpecialty(userSpecialtyCode: userSpecialtyCode, loggedInUserId: loggedInUserId)

                    self.loggedInUserClass.append(loggedUser)
                    print("specCode", userSpecialtyCode as Any) //IT PRINTS THE CORRECT VALUE
                    print("loggedInUser", loggedInUserId as Any) //IT PRINTS THE USER ID
                } else {
                    print("no document")
                }
            }
        }
    }


    @IBAction func logoutTapped(_ sender: Any) {
        let firebaseAuth = Auth.auth()
        do {
            try firebaseAuth.signOut()

        } catch let signoutError as NSError {
            debugPrint("Error signing out: \(signoutError)")
        }
    }
}

【问题讨论】:

  • 究竟是什么不起作用?
  • @vadian 我无法将 userSpecialtyCode 中的值传递给下一个 VC。准备 segue 获得 nil 值。
  • getUserSpecialty() 在哪里调用?此信息至关重要。
  • 在 viewDidLoad() 内部调用
  • @vadian 我刚刚用所有内容更新了代码。谢谢

标签: arrays swift firebase google-cloud-firestore


【解决方案1】:

试试这个

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToResults" {
            let vc = segue.destination as! ResultsdataVC
            _ = vc.view
            if let hosp = hospCode {
                vc.hospCodeFromVC = hosp.hospitalCode
            }
            if let user = currentUserSpecialty {
                vc.userSpecFromVC = user.userSpecialtyCode
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多