段值更改时单元格文本未更改

cell text is not changing when segment value changed

所以我的目标是在更改段值时更改表视图单元格文本。我拥有的第一部分用于所有事件,第二部分用于购买的事件。当视图加载时,它会成功显示所有可用的事件,但是当我将段值更改为已购买时,单元格文本保持不变,我想知道如何解决这个问题。

我创建了一个函数来从 Firestore 数据库中获取购买的事件名称。

func getPurchasedEventName() -> String{
    getStudentID { (studid) in
        if let id = studid {
            self.docListener = self.db.collection("student_users/\(self.user?.uid)/events_bought").whereField("school_id", isEqualTo: id).order(by: "time_purchased", descending: true).addSnapshotListener(includeMetadataChanges: true) { (querySnapshot, error) in
                if error != nil {
                    print("Error fetching docs/ User deletion.")
                } else {
                    self.gotherePurchasedEvents = querySnapshot!.documents.map { document in
                        return PurchasedEventName(purchasedEventName: (document.get("event_name") as! String))
                    }
                    self.tableView.reloadData()
                }
            }
        }
    }

    return "\(gotherePurchasedEvents)"
}

此函数与我用来获取 所有 事件名称的函数相同,因此我认为它可以完成工作。这是相同的函数:

func getSchoolID() -> String {
    //Putting the function in a completion handler
     getStudentGrade { (studentGrade) in
        if let gradeForStudent = studentGrade {
            self.getStudentID { (studentID) in
                if let idForStudent = studentID {
                    self.docListener = self.db.collectionGroup("events").order(by: "time_created", descending: true).whereField("school_id", isEqualTo: idForStudent).whereField("for_grades", isEqualTo: gradeForStudent).addSnapshotListener(includeMetadataChanges: true) { (querySnapshot, error) in
                        if error != nil {
                            print("Error/ User Deletion")
                        } else {
                            self.gothereEvents = querySnapshot!.documents.map { document in
                                return EventName(eventName: (document.get("event_name") as? String) ?? "")
                            }
                            self.tableView.reloadData()
                        }
                    }
                }
            }
        }
    }
  

这会抓取所有事件。

现在我在使用代码时也遇到了一些 index out of range 错误,所以我正在检查 tableView 方法但看不到问题所在,我也会附上这些错误。

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: Constants.CellDetails.studentDashCell, for: indexPath)
    if eventListSelector.selectedSegmentIndex == 0 {
        cell.textLabel?.text = gothereEvents[indexPath.row].eventName
    } else if eventListSelector.selectedSegmentIndex == 1 {
        cell.textLabel?.text = gotherePurchasedEvents[indexPath.row].purchasedEventName
    }
    
    return cell
}

cellForRowAt() 方法。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
    if eventListSelector.selectedSegmentIndex == 0 {
        tableView.separatorColor = #colorLiteral(red: 0.3084011078, green: 0.5618229508, blue: 0, alpha: 1)
        tableView.separatorStyle = .singleLine
        return gothereEvents.count
    } else if eventListSelector.selectedSegmentIndex == 1 {
        tableView.separatorColor = #colorLiteral(red: 0.3084011078, green: 0.5618229508, blue: 0, alpha: 1)
        tableView.separatorStyle = .singleLine
        return gotherePurchasedEvents.count
    } else {
        tableView.separatorStyle = .none
        return 0
    }
    
    
}

numberOfRowsInSection() 方法。

现在 events_bought 集合的问题是它可以为空并且只有一个测试文档,所以如果您查看 getThePurchasedEventName() 方法,我添加了索引以过滤掉查询.我通过购买两个事件并制作一个函数来检查它们是否真的在那里来测试它。

  func checkIfEventsHaveActuallyBeenBought() {
    getStudentID { (studid) in
        if let id = studid {
            self.db.collection("student_users/\(self.user?.uid)/events_bought").whereField("school_id", isEqualTo: id).order(by: "time_purchased", descending: true).addSnapshotListener { (querySnapshot, error) in
                if error != nil {
                    print("Error loading docs")
                } else {
                    for document in querySnapshot!.documents {
                        print("\(document.data())")
                    }
                }
            }

        }
    }
}

这有效并打印了两个文档,但我不明白为什么当我切换分段控制值时,单元格文本没有更改以显示购买的事件。如果您需要更多说明,请随时提问。

缺少相关的 UISegementedControl 代码,所以我不能确定,但​​您似乎希望 tableview 自动响应分段控件中的变化?这不是它的工作原理。虽然您的 tableview 方法会为分段控件的当前状态生成正确的单元格,但您并没有告诉它们在分段控件更改时这样做。

您需要使用控件的目标操作方法并注册和响应值更改事件。

设置控件时需要注册事件,然后实现选择器以响应该事件


//wherever you set up the seg control
let segmentedControl = UISegmentedControl(items:["All","Purchased"])
segmentedControl.addTarget(self, action: #selector(segDidChange), for: .valueChanged)


//then implement the selector method
@objc func segDidChange(control: UISegmentedControl) {
      tableView.reloadData()
}

这是一个粗略的实现,它只是强制重新加载表视图以刷新所有单元格。您也许可以做一些更聪明的事情,也许可以使用新的 tableview diffing 方法。