切换到其他页面时取消选择单元格

时间:2019-08-28 09:09:53

标签: ios swift uicollectionview

我使用UICollectionView制作了一个自定义日历。当我选择一些日期并前进到下个月,然后再回到上个月时,从日历中取消选择了所选项。也许发生在可重复使用的单元格上。我怎么解决这个问题。 为了更好地了解我想要什么:

  1. September中选择4,5,然后移至August/July/November(在本月中,也许选择其他日期)
  2. 然后返回到September。在September中,我要显示4,5为选中状态

我使用didSelectItemAt indexPath尝试了此操作,但是当返回到September时,已取消选择了选定的项目

public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if let cell = collectionView.cellForItem(at: indexPath) as? CalendarDateRangePickerCell {
            if cell.isSelected == true {
                cell.backgroundColor = .blue
                cell.label.textColor = .white
                cell.isUserInteractionEnabled = true
            }
            selectedDate = cell.date!
        }

    }

3 个答案:

答案 0 :(得分:2)

首先创建一个选定单元格的数组。如果使用模型将数据设置为单元格,则可以创建一组选定模型。或者您可以创建一个包含所选行的数组。

假设您正在使用模型。

var selectedDates: [DateModel] = []

然后

public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    if let cell = collectionView.cellForItem(at: indexPath) as? CalendarDateRangePickerCell {

        selectedDate = cell.date!
        if !selectedDates.contains(dataSourceModel[indexPath.row]) {
          selectedDates.append(dataSourceModel[indexPath.row])
        }
    }

}

然后在您的cellForItem

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  if selectedDates.contains(dataSourceModel[indexPath.row]) {
     cell.isSelected = true
  }
}

还要确保取消选中模型后将其删除

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        if selectedDates.contains(dataSourceModel[indexPath.row]) {
          selectedDates.remove(dataSourceModel[indexPath.row])
        }
    }

*可能包含一些语法错误,但是您可以按照以下路径操作以获取所需的位置。

答案 1 :(得分:0)

滚动时,UITableViewUICollectionView中的单元格将被重用,这就是为什么您应该在另一个位置存储选择的日期。然后,在cellForItem中,您应该设置isSelected

答案 2 :(得分:0)

您是否尝试过在clearsSelectionOnViewWillAppear中将false设置为viewDidLoad()

  

一个布尔值,指示在出现集合视图时控制器是否清除选择。

     

此属性的默认值为true。设为true时,集合视图控制器会在收到viewWillAppear(_ :)消息时清除集合视图的当前选择。将此属性设置为false会保留选择。

来源:Apple Developer Documentation