после фильтрации данных из Firestore с помощью PickerViewer я не могу отправить данные в другой VC - PullRequest
0 голосов
/ 12 июня 2019

У меня есть UIPickerViewer с 3 строками, после запроса данных из Firestore я хочу иметь возможность отправить результаты на TableView в другом VC.Segue работает, но данные не передаются.Не уверен, что мне не хватает или что я делаю не так.Спасибо!

Я могу получить данные из Firestore в TableView напрямую, но, когда я фильтрую данные, используя PickerView, я не могу отправить результаты в TableView на отдельномVC.

    @IBAction func getDataTapped(_ sender: Any) {
    SVProgressHUD.show()

    if HOSP != (hospnameTxt.text!) {
        query = 
Firestore.firestore().collection(PTLIST_REF).whereField("hosp", 
isEqualTo: (hospnameTxt.text!))
    } else if TEAM != teamnameTxt.text {
        query = 
Firestore.firestore().collection(PTLIST_REF).whereField("team", 
isEqualTo: (teamnameTxt.text!))
    } else if ASSIGNEDMD != provnameTxt.text {
        query = 
Firestore.firestore().collection(PTLIST_REF).whereField("assignedmd", 
isEqualTo: (provnameTxt.text!))

    }

    query.getDocuments { (snapshot, error) in
        if let err = error {
            debugPrint("error getting data: \(err)")
        } else {
            guard let snap = snapshot else { return }
            for document in snap.documents {
                let data = document.data()
                let assigneddate = data[ASSIGNEDDATE] as? String ?? ""
                let assignedmd = data[ASSIGNEDMD] as? String ?? ""
                let officemd = data[OFFICEMD] as? String ?? ""
                let ptname = data[PTNAME] as? String ?? ""
                let room = data[ROOM] as? String ?? ""
                let seenosee = data[SEENOSEE] as? String ?? ""

                let newPtList = PTList(assigneddate: assigneddate, 
assignedmd: assignedmd, officemd: officemd, ptname: ptname, room: 
room, seenosee: seenosee)
                self.ptlists.append(newPtList)
                print(document.data())
            }
            //self.TableView.reloadData()
        }
        self.performSegue(withIdentifier: "gotoresults", sender: self)

    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "gotoresults" {
        let vc = segue.destination as! resultsdataVC
        vc.ptlists = ptlists
        SVProgressHUD.dismiss()
    }
}

resultsdataVC

class resultsdataVC: UIViewController, UITableViewDataSource, 
UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

var ptlist: PTList!
var ptlists = [PTList]()

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self

}

func tableView(_ tableView: UITableView, numberOfRowsInSection 
section: Int) -> Int {
    return ptlists.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
IndexPath) -> UITableViewCell {

    if let cell = tableView.dequeueReusableCell(withIdentifier: 
"ptlistCell", for: indexPath)
        as? ptlistCell {
        cell.configureCell(ptlist: ptlists[indexPath.row])
        return cell
    }
    return UITableViewCell()
  }
}

ptlistCell

class ptlistCell: UITableViewCell {

@IBOutlet private weak var ptnameLbl: UILabel!
@IBOutlet private weak var assignedmdLbl: UILabel!
@IBOutlet private weak var officemdLbl: UILabel!
@IBOutlet private weak var roomnumberLbl: UILabel!
@IBOutlet private weak var seenoseeLbl: UILabel!
@IBOutlet private weak var assigneddateLbl: UILabel!

private var ptlist: PTList!

override func awakeFromNib() {
    super.awakeFromNib()

}

func configureCell(ptlist: PTList) {

    ptnameLbl.text = ptlist.ptname
    assignedmdLbl.text = ptlist.assignedmd
    officemdLbl.text = ptlist.officemd
    roomnumberLbl.text = ptlist.room
    seenoseeLbl.text = ptlist.seenosee
    assigneddateLbl.text = ptlist.assigneddate 

}


@IBAction func ptdataTapped(_ sender: Any) {

}

1 Ответ

1 голос
/ 12 июня 2019

Вызов firebase внутри prepare(for segue: слишком поздно, Segue выполняется до того, как данные извлекаются из firebase, поскольку это асинхронно, так что

@IBAction func getDataTapped(_ sender: Any) {
   firebaseCall {
    // inside it the segue and the data is fetched successfully 
    performSegue(withIdentifier: "gotoresults", sender: self)
  }
} 
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "gotoresults" {
        let vc = segue.destination as! resultsdataVC
        vc.data = data // set any data here 
    }
}

Edit:

@IBAction func getDataTapped(_ sender: Any) {

        if HOSP != (hospnameTxt.text!) {
            query =
                Firestore.firestore().collection(PTLIST_REF).whereField("hosp",
                                                                        isEqualTo: (hospnameTxt.text!))
        } else if TEAM != teamnameTxt.text {
            query =
                Firestore.firestore().collection(PTLIST_REF).whereField("team",
                                                                        isEqualTo: (teamnameTxt.text!))
        } else if ASSIGNEDMD != provnameTxt.text {
            query =
                Firestore.firestore().collection(PTLIST_REF).whereField("assignedmd",
                                                                        isEqualTo: (provnameTxt.text!))

        }

        query.getDocuments { (snapshot, error) in
            if let err = error {
                debugPrint("error getting data: \(err)")
            } else {
                guard let snap = snapshot else { return }
                for document in snap.documents {
                    let data = document.data()
                    let assigneddate = data[ASSIGNEDDATE] as? String ?? ""
                    let assignedmd = data[ASSIGNEDMD] as? String ?? ""
                    let officemd = data[OFFICEMD] as? String ?? ""
                    let ptname = data[PTNAME] as? String ?? ""
                    let room = data[ROOM] as? String ?? ""
                    let seenosee = data[SEENOSEE] as? String ?? ""

                    let newPtList = PTList(assigneddate: assigneddate,
                                           assignedmd: assignedmd, officemd: officemd, ptname: ptname, room:
                        room, seenosee: seenosee)
                    self.ptlists.append(newPtList)
                    print(document.data())
                }

            }

            performSegue(withIdentifier: "gotoresults", sender: self)

        }
    }

    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "gotoresults" {
            let vc = segue.destination as! resultsdataVC
            vc.ptlists = ptlists
        }
    }
}
...