Я изо всех сил пытаюсь разобраться с базой данных в реальном времени Firebase и чтобы она прекрасно играла с Table View в моем приложении для заказа ресторанов!
Прежде чем читать мой код (пожалуйста, не смейтесь), я надеюсь, что мой TableView сможет сделать следующее:
1) сортировать запросы по категориям (используя значение, полученное из ключа "RequestItemCategory", значение Int которого равно 1, 2, 3)
2) добавить новый запрос в табличное представление и снова отсортировать запросы по категории
3) удалить заполненный запрос на питание из таблицы, когда клиент или сотрудник отметит «завершить заказ» на другом устройстве, что приведет к изменению ключа «RequestCompleted» запрашиваемого дочернего элемента в Firebase на «true»)
Единственное, чего я могу достичь после нескольких часов бездельничания, это
- при запуске приложения приложение загружает таблицу и отображает все запросы в правильном порядке в соответствии с их категорией, но даже запросы, помеченные как завершенные в Firebase, по-прежнему отображаются.
- новые заказы добавляются в конец списка, но не сортируются по категориям.
Что я пробовал
1) Тег .queryEqual (toValue: «false», childKey: «RequestCompleted»), чтобы попытаться отфильтровать выполненные запросы, возвращает пустую таблицу (не ноль информации)
2) Я могу использовать кнопку для очистки requestArray, затем снова вызывает retrieveRequest (). Это обновит таблицу, и все запросы будут в правильном порядке, но я бы хотел сделать это автоматически, если это возможно. Кроме того, этот метод создаст другого наблюдателя, поэтому я завершил несколько одинаковых заказов, добавленных в список ...
3) использование .value вместо .childAdded - возвращает ноль и приложение вылетает - думаю, мне нужно использовать циклы, но я не уверен, как это сделать.
Пожалуйста, помогите спасибо!
![enter image description here](https://i.stack.imgur.com/wwhge.jpg)
Коды:
Объект класса
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)