关闭视图控制器时在 UITableViewCell 中保存 UICollectionView 的选定状态

Posted

技术标签:

【中文标题】关闭视图控制器时在 UITableViewCell 中保存 UICollectionView 的选定状态【英文标题】:Save selected state of UICollectionView inside UITableViewCell when dismiss the view controller 【发布时间】:2020-01-01 09:50:55 【问题描述】:

如何将UICollectionView 的选定状态保存在UITableViewCell 中?

有关更多详细信息,我有一个 UITableView 有 5 个部分,每个部分只有一个单元格,我将另一个 UICollectionView 放入表格视图的单元格中,每当我选择一个集合视图单元格的项目时,它都会突出显示有红色背景。

现在我想保存集合视图的选择状态,即使我关闭视图控制器然后再次打开它,它必须显示正确的选定项目,我想我将使用 UserDefaults 进行保存。但我注意到,当我在另一个部分中选择一个集合视图项时,它总是保存与表视图的第一部分相同的索引。

这是我将选定的索引路径保存到数组的代码,你能告诉我我的错误在哪里吗:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        let strData = itemFilter[indexPath.section].value[indexPath.item]
        let cell = collectionView.cellForItem(at: indexPath) as? SDFilterCollectionCell

        cell?.filterSelectionComponent?.bind(title: strData.option_name!, style: .select)
        cell?.backgroundColor = .red
        cell?.layer.borderColor = UIColor.white.cgColor

        arrSelectedIndex.append(indexPath)
    

当取消选择时:

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) 
        let strData = itemFilter[indexPath.section].value[indexPath.item]
        let cell = collectionView.cellForItem(at: indexPath) as? SDFilterCollectionCell

        cell?.filterSelectionComponent?.bind(title: strData.option_name!, style: .unselect)
        cell?.backgroundColor = .white
        cell?.layer.borderColor = UIColor.black.cgColor

        if arrSelectedIndex.count > 0 
            arrSelectedIndex = arrSelectedIndex.filter($0 != indexPath)
        else 
            arrSelectedIndex.removeAll()
        

    

【问题讨论】:

【参考方案1】:

正如您所说,您想将arrSelectedIndex 保存在userdefault 中,因此请从userdefault 获取arrSelectedIndex。 如果您在 UITableView 的每个部分都有 collectionView,那么使用 arrSelectedIndex 保存表格部分的 indexpath



 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        guard let cell = collectionView.cellForItem(at: indexPath) as? SDFilterCollectionCell else 
            return UICollectionViewCell()
        

        // color the background accordingly
        if arrSelectedIndex.contains(indexPath) 
            // selected state
            cell.backgroundColor = .red
         else 
            // non-selected state
            cell.backgroundColor = .white
        

        cell.layer.borderColor = UIColor.white.cgColor

        return cell
    

【讨论】:

这就是我现在正在做的事情。但正如我所说,保存的 indexPath 是错误的。例如,如果我将UICollectionView 中的一个indexPath 保存在UITableView 的第0 部分中,则其他表格视图部分中具有相同indexPath 的所有项目也将显示为选中状态。

以上是关于关闭视图控制器时在 UITableViewCell 中保存 UICollectionView 的选定状态的主要内容,如果未能解决你的问题,请参考以下文章

使用平移手势识别器关闭视图控制器

滚动关闭和打开后,视图重新出现在 UITableViewCell 中

动画视图控制器并同时在表格视图中重新加载数据

从另一个视图控制器单击 uitableviewcell 后,swift 3 更改 uitableviewcell?

使用 PKRevealController 时在前视图上推送新视图

UITableViewCell 编辑很难显示