Arrays 当段值更改时,单元格文本不更改
因此,我的目标是在更改段值时更改tableview单元格文本。我拥有的第一部分是针对所有活动的,第二部分是针对购买的活动的。当视图加载时,它成功显示所有可用事件,但当我将段值更改为“已购买”时,单元格文本保持不变,我想知道如何修复此问题 我创建了一个函数,从Firestore数据库中获取购买的事件名称Arrays 当段值更改时,单元格文本不更改,arrays,swift,uitableview,google-cloud-firestore,uisegmentedcontrol,Arrays,Swift,Uitableview,Google Cloud Firestore,Uisegmentedcontrol,因此,我的目标是在更改段值时更改tableview单元格文本。我拥有的第一部分是针对所有活动的,第二部分是针对购买的活动的。当视图加载时,它成功显示所有可用事件,但当我将段值更改为“已购买”时,单元格文本保持不变,我想知道如何修复此问题 我创建了一个函数,从Firestore数据库中获取购买的事件名称 func getPurchasedEventName() -> String{ getStudentID { (studid) in if let id = stud
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()
}
}
}
}
}
}
这抓住了所有事件
现在,在玩代码时,我也遇到了一些索引超出范围的错误,所以我检查了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()
方法
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
}
}
现在,您购买的events\u
集合的问题是,它可以是空的,并且只有一个测试文档,因此如果您查看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以刷新所有单元格。您可能可以做一些更聪明的事情,也许可以使用新的tableview diffing方法。我通过故事板实现了分段控件,并且有一个iAction可以更改导航栏标题,但我无法访问单元格操作,这不是仅用于编程的代码吗@那么,如果我想在tableview委托/数据源方法中执行,那么我将如何使用它,它将需要一个@objc
方法,不是吗@flanker@dsonawave是的,这是程序性的方法。如果您使用的是IB,那么它会更简单——只需在IBAction方法中重新加载tableview。原理是一样的。委托方法在哪里没有任何区别——您不直接调用它们;启动重新加载时,tableview本身将调用这些方法。此时numberofRows/cellForRowAt将查询分段控件并正确构建单元格。太棒了,我将试一试@伙计,你是山羊。谢谢,真的很管用。上帝保佑