当 tableview 单元格匹配条件 Swift 时尝试更新集合视图
我在同一个视图控制器中有一个 calendarTableview
代表一个月和一个 timeSlotCollectionView
代表当天的开放时间,分为 30 分钟.我的意图是在 calendarTableview
cellForRowAt
中加载视图控制器时,我检查它是否是当天并将其设置为选中,然后加载 timeSlotCollectionView
再次有一定的标准.仅当我实际选择行时,这一切都符合预期,触发 didSelectRowAt
但不是在第一次加载时.所有更新都由我在 cellForRowAt
和 didSelectRowAt
中调用的函数完成,但加载时不更新 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 timeSlotCollectionView
with again a certain criteria. It all works es expected only when I physically select the row, triggering didSelectRowAt
but not on first load. All the updating is done by a function that I call in both cellForRowAt
and 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 timeSlotCollectionView
in 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 timeSlotCollectionView
reading 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 timeSlotCollectionView
gets 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!)")
}
}