Arrays 当段值更改时,单元格文本不更改

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

因此,我的目标是在更改段值时更改tableview单元格文本。我拥有的第一部分是针对所有活动的,第二部分是针对购买的活动的。当视图加载时,它成功显示所有可用事件,但当我将段值更改为“已购买”时,单元格文本保持不变,我想知道如何修复此问题

我创建了一个函数,从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()
                        }
                    }
                }
            }
        }
    }
  
这抓住了所有事件

现在,在玩代码时,我也遇到了一些
索引超出范围的错误,所以我检查了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将查询分段控件并正确构建单元格。太棒了,我将试一试@伙计,你是山羊。谢谢,真的很管用。上帝保佑