Kyle Leong
Kyle Leong

Reputation: 1

How to display next index path row and section items into tableviewer

I've try to fetch data from firestore documents and display in tableview cells, but some how that only will show the first row of data only. please kindly help to review my code below and see which part went wrong. Thanks a lot.

enter code here
@IBOutlet weak var ResDateTxt: UITextField!
@IBOutlet weak var ResTableView: UITableView!
@IBOutlet weak var CheckResBtn: UIStackView!

let userDefault = UserDefaults.standard
let resDatePick = UIDatePicker()

var ReservationList = [Reservation]()

override func viewDidLoad() {
    super.viewDidLoad()

    hidKeyBoardWhenTappedAround()
    createDatePicker()
    ResTableView.register(UITableViewCell.self, forCellReuseIdentifier: "ResCell")
    ResTableView.delegate = self
    ResTableView.dataSource = self

    // Do any additional setup after loading the view.
}

@IBAction func CheckResTapped(_ sender: Any) {
    let ResCollectionRef = Firestore.firestore().collection("Reservations").whereField("resDate", isEqualTo: ResDateTxt.text!)
        ResCollectionRef.getDocuments { (snapshot, error) in
        if let err = error {
            debugPrint("Error fetching doc: \(err)")
        } else {
            self.ReservationList = snapshot!.documents.compactMap({Reservation(dictionary: $0.data())})
            print(self.ReservationList)
            DispatchQueue.main.async {
                self.ResTableView.reloadData()
            }
          
        }
    }
}

func createDatePicker() {
    
    ResDateTxt.textAlignment = .center
    //toolbar
    let toolbar = UIToolbar()
    toolbar.sizeToFit()
    
    //bar button
    let doneBtn = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))
    toolbar.setItems([doneBtn], animated: true)
    
    //assign toolbar
    ResDateTxt.inputAccessoryView = toolbar
    //assign date picker to the text feild
    ResDateTxt.inputView = resDatePick
    
    resDatePick.datePickerMode = .date
    resDatePick.minimumDate = Calendar.current.date(byAdding: .day, value: 0, to: Date())
    resDatePick.maximumDate = Calendar.current.date(byAdding: .month, value: 1, to: Date())
}

@objc func donePressed() {
    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeStyle = .none
    
    ResDateTxt.text = formatter.string(from: resDatePick.date)
    self.view.endEditing(true)
}

}

extension ResDetailViewController: UITableViewDelegate, UITableViewDataSource {

func numberOfSections(in tableView: UITableView) -> Int {
    return ReservationList.count
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    **let cell = tableView.dequeueReusableCell(withIdentifier: "ResCell", for: indexPath)
    let Res = ReservationList[indexPath.row]
    cell.textLabel?.text = Res.FirstName
    cell.detailTextLabel?.text = Res.LastName**
    
}

}

Upvotes: 0

Views: 153

Answers (1)

Tob
Tob

Reputation: 1025

You switched up the functions numberOfRowsInSection and numberOfSections. It should be:

func numberOfSections(in tableView: UITableView) -> Int {
      return 1
}

And:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
        // This is the function that says how many rows in the tableView
        return ReservationList.count
 }

Upvotes: 2

Related Questions