当 tableview 单元格匹配条件 Swift 时尝试更新集合视图 [英] Trying to update a collection view when tableview cell matches a criteria Swift

查看:27
本文介绍了当 tableview 单元格匹配条件 Swift 时尝试更新集合视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在同一个视图控制器中有一个 calendarTableview 代表一个月和一个 timeSlotCollectionView 代表当天的开放时间,分为 30 分钟.我的意图是在 calendarTableview cellForRowAt 中加载视图控制器时,我检查它是否是当天并将其设置为选中,然后加载 timeSlotCollectionView再次有一定的标准.仅当我实际选择行时,这一切都符合预期,触发 didSelectRowAt 但不是在第一次加载时.所有更新都由我在 cellForRowAtdidSelectRowAt 中调用的函数完成,但加载时不更新 timeSlotCollectionView.我在我的应用程序的下一阶段遇到了类似的问题,当您实际选择一个时间段并且我之前的问题已经解决时,但我无法在这种情况下应用它.这次你能看出我错在哪里了吗?

I have In the same view controller a calendarTableview that represent a month and a timeSlotCollectionView that represent the current day opening time divided in 30 min slots. My intent is that at loading the view controller inside calendarTableview cellForRowAt I check if it's current day and set it as selected, and load the timeSlotCollectionViewwith again a certain criteria. It all works es expected only when I physically select the row, triggering didSelectRowAtbut not on first load. All the updating is done by a function that I call in both cellForRowAtand didSelectRowAt, but on load is not updating timeSlotCollectionView. I had a similar problem in the next stage of my app, when you actually select a time slot and with my previous question has been solved, but I can't apply that in this scenario. Can you see where I'm mistaking this time?

功能是:
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()

        }

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

Can it be a time lag between the cells creation of the two? In my other question this was the case. Many thanks as always.

推荐答案

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

I found what the problem was. I was refreshing timeSlotCollectionViewin a function that calculated the booked time slots. I guess that there was I little time gap between the array being populated from that function and timeSlotCollectionViewreading from that array to draw its cells, resulting in plain cells. I modified cellForItemAt so I can perform the check for condition directly from fetched results and that way I could bypass that function. Now the correct cell in calendarTableView gets selected and timeSlotCollectionViewgets populated with correct cells. I hope that this could help others facing the same problem.

这是新功能:

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!)")

            }
        }

这篇关于当 tableview 单元格匹配条件 Swift 时尝试更新集合视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆