首页 > 解决方案 > 当tableview单元格匹配标准Swift时尝试更新集合视图

问题描述

我在同一个视图控制器calendarTableview中 a 代表一个月, atimeSlotCollectionView代表当天的开放时间,分为 30 分钟的时段。我的意图是在内部加载视图控制器时,calendarTableview cellForRowAt我检查它是否是当前日期并将其设置为选中,然后timeSlotCollectionView再次加载具有特定条件的。didSelectRowAt只有当我物理选择行,触发但不是在第一次加载时,这一切都可以正常工作。所有更新都是由我在cellForRowAt和中调用的函数完成的didSelectRowAt,但加载时不会更新timeSlotCollectionView。我在我的应用程序的下一阶段遇到了类似的问题,当您实际选择一个时间段并且我之前的问题已经解决时,但我无法在这种情况下应用它。你能看出我这次错在哪里了吗?

功能是:
对于calendarTableView

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            let cell = tableView.dequeueReusableCell(withIdentifier: "calendarCell", for: indexPath) as! CalendarTableViewCell

            // Configure the cell...

            let date = datesArray[indexPath.row]
            print(date)

            let calendar = Calendar.current
            let components = calendar.dateComponents([.year, .month, .day, .weekday], from: date)

            cell.dayLabel.text = "\(String(describing: components.day!))" + " " + "\(dayNamesArray[components.weekday! - 1])"
            cell.cellWeekday = components.weekday!
            print("cell weekday is: \(cell.cellWeekday!)") // prints correct weekday

            cell.cellId = "\(String(format:"%04d", components.year!))" + "\(String(format:"%02d", components.month!))" + "\(String(format:"%02d", components.day!))"
            self.selectedDate = cell.cellId // used for time slots cellId

            // highlighting current day cell
            if indexPath.row == self.actualDay - 1 && self.actualMonth == self.displayedMonth {

                cell.dayLabel.backgroundColor = UIColor.red.withAlphaComponent(0.3)

                // emulate user selecting the cell
                tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none) // changing to .middle makes the tableview go looping
                print(" @@@@@@@@@@@@@@@@@@@@@@@@@@   selected cell weekday is: \(cell.cellWeekday!) @@@@@@@@@@@@@@@@@@@@ ")

                self.updateTimeSlots(selectedCell: cell)
    //            self.actualWeekday = cell.cellWeekday!
    //            self.selectedDate = cell.cellId
    //            calculateOpenTimeSlots()

            }
            let cornerRadius: CGFloat = 5
            cell.layer.cornerRadius = cornerRadius
            cell.clipsToBounds = true
            return cell
        }


        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let cell = tableView.cellForRow(at: indexPath) as! CalendarTableViewCell
            self.updateTimeSlots(selectedCell: cell)
    //        self.actualWeekday = cell.cellWeekday!
    //        self.selectedDate = cell.cellId
    //        print(" selected cell weekday is: \(cell.cellWeekday!)")
    //        calculateOpenTimeSlots()

        }

对于timeSlotCollectionView

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "timeSlotCell", for: indexPath) as! TimeSlotCollectionViewCell
    //        let booking = self.fetchedResultController.object(at: indexPath)

            // Configure the cell
            cell.timeLabel.text = timeSlotArray[indexPath.row]
            cell.cellId = Int64("\(String(describing: self.selectedDate))" + self.timeStringToStringConvert(timeSlotArray[indexPath.row]))!


            // method two USING fetchResultController 
            if (self.fetchedResultController.fetchedObjects?.count)! > 0 {
                        for value in self.fetchedResultController.fetchedObjects! {
                            if Int64(value.bookingId!) == cell.cellId {
                                print("   match found")
                                print("Index is: \(index)")
                                print("cell time is: \(timeSlotArray[indexPath.row])")
                                print("time slot cell id is: \(String(describing: cell.cellId))")
                                print("booking id: \(bookingId)")
                                //                    cell.backgroundColor = UIColor.red.withAlphaComponent(0.8)
                                cell.bookingState.backgroundColor = UIColor.red.withAlphaComponent(0.8)
                            }
                        }
            }


            print(" cell.cellId is : \(String(describing: cell.cellId!))")
            print("    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ time slot created @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    ")



   // Method one : USING ARRAY works in realtime
//        if bookedTimeSlotsArray.count > 0 {
//            for index in 0...bookedTimeSlotsArray.count - 1 {
//                let bookingId = bookedTimeSlotsArray[index].bookingId
//
//                if cell.cellId == bookingId {
//                    print("   match found")
//                    print("Index is: \(index)")
//                    print("cell time is: \(timeSlotArray[indexPath.row])")
//                    print("time slot cell id is: \(String(describing: cell.cellId))")
//                    print("booking id: \(bookingId)")
////                    cell.backgroundColor = UIColor.red.withAlphaComponent(0.8)
//                    cell.bookingState.backgroundColor = UIColor.red.withAlphaComponent(0.8)
//                }
//            }
//        }
        return cell
    }

和值更新:

func updateTimeSlots(selectedCell: CalendarTableViewCell) {

            self.actualWeekday = selectedCell.cellWeekday!
            self.selectedDate = selectedCell.cellId
            print(" selected cell weekday is: \(selectedCell.cellWeekday!)")
            fetchBookings()
            calculateOpenTimeSlots()

        }

两者的细胞创建之间会存在时间差吗?在我的另一个问题中就是这种情况。非常感谢一如既往。

标签: iosswiftuitableviewuicollectionview

解决方案


我发现了问题所在。我正在刷新timeSlotCollectionView一个计算预订时间段的函数。timeSlotCollectionView我猜想从该函数填充数组与从该数组读取以绘制其单元格之间几乎没有时间间隔,从而产生普通单元格。我进行了修改cellForItemAt,以便可以直接从获取的结果中执行条件检查,这样我就可以绕过该功能。现在正确的单元格calendarTableView被选中并timeSlotCollectionView填充了正确的单元格。我希望这可以帮助其他面临同样问题的人。

这是新功能:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "timeSlotCell", for: indexPath) as! TimeSlotCollectionViewCell
        //        let booking = self.fetchedResultController.object(at: indexPath)

        // Configure the cell
        cell.timeLabel.text = timeSlotArray[indexPath.row]
        cell.cellTime = timeSlotArray[indexPath.row]
        cell.cellId = Int64("\(String(describing: self.selectedDate))" + self.timeStringToStringConvert(timeSlotArray[indexPath.row]))!


        // method two USING fetchResultController 
        if (self.fetchedResultController.fetchedObjects?.count)! > 0 {
            for valueStart in self.fetchedResultController.fetchedObjects! {
                // booking start match

                if timeStringToStringConvert(cell.cellTime) == timeStringToStringConvert(valueStart.bookingStart!) {//} && cell.cellTime <= timeStringToStringConvert(valueStart.bookingEnd!) {

                    print("   match found")
                    //                    print("Index is: \(index)")
                    print("cell time is: \(timeSlotArray[indexPath.row])")
                    print("time slot cell id is: \(String(describing: cell.cellId))")
                    print("booking id: \(valueStart.bookingId!)")
                    //                    cell.backgroundColor = UIColor.red.withAlphaComponent(0.8)
                    cell.bookingState.backgroundColor = UIColor.red.withAlphaComponent(0.8)
                    cell.backgroundColor = UIColor.red.withAlphaComponent(0.25)


                }

                else if timeStringToStringConvert(cell.cellTime) > timeStringToStringConvert(valueStart.bookingStart!) && timeStringToStringConvert(cell.cellTime) < timeStringToStringConvert(valueStart.bookingEnd!){

                    print(" Mid slot found")
                    print(" mid slot id is: \(String(describing: cell.cellId))")
                    cell.bookingState.backgroundColor = UIColor.red.withAlphaComponent(0.3)
                    cell.backgroundColor = UIColor.red.withAlphaComponent(0.15)
                    cell.isUserInteractionEnabled = false

                }


                print("bookingId is: \(valueStart.bookingId!)")

            }
        }

推荐阅读