Как заставить Firebase играть хорошо с TableView - PullRequest
0 голосов
/ 01 ноября 2018

Я изо всех сил пытаюсь разобраться с базой данных в реальном времени Firebase и чтобы она прекрасно играла с Table View в моем приложении для заказа ресторанов!

Прежде чем читать мой код (пожалуйста, не смейтесь), я надеюсь, что мой TableView сможет сделать следующее:

1) сортировать запросы по категориям (используя значение, полученное из ключа "RequestItemCategory", значение Int которого равно 1, 2, 3) 2) добавить новый запрос в табличное представление и снова отсортировать запросы по категории 3) удалить заполненный запрос на питание из таблицы, когда клиент или сотрудник отметит «завершить заказ» на другом устройстве, что приведет к изменению ключа «RequestCompleted» запрашиваемого дочернего элемента в Firebase на «true»)

Единственное, чего я могу достичь после нескольких часов бездельничания, это

  1. при запуске приложения приложение загружает таблицу и отображает все запросы в правильном порядке в соответствии с их категорией, но даже запросы, помеченные как завершенные в Firebase, по-прежнему отображаются.
  2. новые заказы добавляются в конец списка, но не сортируются по категориям.

Что я пробовал 1) Тег .queryEqual (toValue: «false», childKey: «RequestCompleted»), чтобы попытаться отфильтровать выполненные запросы, возвращает пустую таблицу (не ноль информации) 2) Я могу использовать кнопку для очистки requestArray, затем снова вызывает retrieveRequest (). Это обновит таблицу, и все запросы будут в правильном порядке, но я бы хотел сделать это автоматически, если это возможно. Кроме того, этот метод создаст другого наблюдателя, поэтому я завершил несколько одинаковых заказов, добавленных в список ... 3) использование .value вместо .childAdded - возвращает ноль и приложение вылетает - думаю, мне нужно использовать циклы, но я не уверен, как это сделать.

Пожалуйста, помогите спасибо!

enter image description here

Коды:

Объект класса

class Request {
    var name : String = ""
    var requestItem : String = ""
    var seat : String = ""
    var requestCategory : String = ""
}

Cell.swift

import UIKit

class CustomCellTableViewCell: UITableViewCell {
    @IBOutlet var requestText : UITextField!
    @IBOutlet var nameText: UITextField!
    @IBOutlet var seatNumberText: UITextField!
    @IBOutlet var timerText: UITextField!
    @IBOutlet var cellBackground : UIView!
    @IBOutlet var cellCategoryView : UIView!
    @IBOutlet var cellCategoryLabel : UILabel!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

ViewController.swift

import UIKit
import Firebase
import SVProgressHUD

class MainPageViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {
    @IBOutlet weak var requestTableView: UITableView!
    var requestArray : [Request] = [Request]()
    override func viewDidLoad() {
        super.viewDidLoad()
        requestTableView.delegate = self
        requestTableView.dataSource = self
        requestTableView.register(UINib(nibName: "CustomCellTableViewCell", bundle: nil),  forCellReuseIdentifier: "customRequestCell")
        configureTableView()
        retrieveRequest()
        // Do any additional setup after loading the view.
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customRequestCell", for: indexPath) as! CustomCellTableViewCell
        cell.nameText.text = requestArray[indexPath.row].name
        cell.seatNumberText.text = requestArray[indexPath.row].seat
        cell.requestText.text = requestArray[indexPath.row].requestItem
        cell.cellCategoryLabel.text = requestArray [indexPath.row].requestCategory
        if cell.cellCategoryLabel.text == "1" {
            cell.cellBackground.backgroundColor = UIColor.init(red: 142/255, green: 0/255, blue: 0/255, alpha: 0.65)
        } else if cell.cellCategoryLabel.text == "2" {
            cell.cellBackground.backgroundColor = UIColor.init(red: 234/255, green: 179/255, blue: 0/255, alpha: 0.75)
        } else {
            cell.cellBackground.backgroundColor = UIColor.init(red: 0/255, green: 113/255, blue: 119/255, alpha: 0.65)
        }


        return cell
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return requestArray.count
    }
    func configureTableView() {
        requestTableView.rowHeight = UITableView.automaticDimension
        requestTableView.estimatedRowHeight = 73
    }
    func retrieveRequest() {

        let ref = Database.database().reference().child(“Restaurant”).child("Requests").queryOrdered(byChild: "RequestItemCategory")**.queryEqual(toValue: "false", childKey: "RequestCompleted")** adding .queryEqual doesn't work...

        ref.observe(.childAdded) { (snapshot) in

            let snapshotValue = snapshot.value as? [String : AnyObject] ?? [:]
            let customerName = snapshotValue["Lastname"]
            let customerSeatnumber = snapshotValue[“Seat”]
            let customerRequestedItem = snapshotValue["RequestItem"]
            let customerRequestedItemCategory = snapshotValue ["RequestItemCategory"]

            let request = Request()
            request.name = customerName as! String
            request.seat = customerSeatnumber as! String
            request.requestItem = customerRequestedItem as! String
            request.requestCategory = "\(customerRequestedItemCategory!)"

            self.requestArray.append(request)
            self.configureTableView()
            self.requestTableView.reloadData()

        }
    }
}

пс. requestLabel.text используется для изменения цвета определенного UIView в соответствии с категорией (RequestItemCategory)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...