通知集合视图单元以使用NotificationCenter-swift

时间:2018-07-12 13:16:27

标签: ios swift

这是好事吗?是否在不重新加载所有集合视图单元的情况下观察集合视图单元中的通知和更改值?

我知道我可以像这样重新加载单元格

collectionView.reloadCell(at....)

但事实并非如此,我希望单元格独立更新其子视图,而不使用集合视图

我有一个收藏视图,它有一个或多个单元格,每个单元格都有一个标签,用于显示购物车中当前有多少物品,因此,当用户向购物车中添加东西时,我的收藏夹视图单元格必须更改其计数标签文字

我观察是否有通知,然后检查添加的项目的ID与我的单元格项目ID,如果相等,则单元格必须更改计数标签值 the numbers are look like this numbers above each item

我可以举一个例子,假设我们有一些单元格,每个单元格开始加载10张图像,每次下载图像时,单元格都必须更改其下载计数标签,以便用户可以查看下载的图像数量,

5 个答案:

答案 0 :(得分:2)

不,那不是一个好主意。您希望单元格反映它们显示的模型的状态。如果模型发生更改,则需要通知表视图它需要更新其单元格。

您可以实现仅重新加载已更改的特定单元格的逻辑。 (使用方法reloadRows(at:with:)

答案 1 :(得分:1)

您可以通过重新加载collectionView的特定单元格来实现。希望您对所列产品使用异步图片。

let row = YOUR RESULTED ROW VALUE, UPDATE IT 
let indexPath = IndexPath(row: row, section: 0)
collectionView?.reloadItems(at: [indexPath])

通过Notification实现不是一个好主意,上述解决方案是个好方法。

答案 2 :(得分:0)

正如其他人建议的那样,最好更改模型,然后重新加载单元。 但实际上您可以通过执行以下操作来访问集合视图的特定单元格

collectionView.cellForItem(at indexPath: IndexPath)

然后您可以将返回的UICollectionViewCell投射到自定义单元格并访问该单元格的子视图。

重要:如果该单元格不可见,此方法将返回nil

答案 3 :(得分:0)

在这种情况下,我对单元格更新动画并不满意,所以我一直在寻找一种方法来让这一责任移交给我的单元格,以便他们可以独立更改子视图, 但是你们所有人都告诉我使用该选项,所以我一直在寻找停止单元格更新动画的方法,我的意思是我不想让用户注意到整个单元格都已更新(淡入淡出...),所以我提出了这种解决方案

    UIView.performWithoutAnimation {
        // Update UI that you don't want to animate

       self.collectionView.cellForItem(at indexPath: IndexPath)
    }

现在我通知我的收藏视图,检查该项目当前是否显示在屏幕上,然后重新加载没有动画的索引

答案 4 :(得分:0)

您需要浏览可见的单元格并进行相应的更改。

1-更改数据源中的值

2-使用tableView的docker logs -f #####属性https://developer.apple.com/documentation/uikit/uitableview/1614896-visiblecells查找更改的单元格。

3-在单元格中调用将更改值/数字的方法

很明显,如果该单元格不可见,则下次更改该单元格时将对其进行更改。只要确保使您的数据源保持最新(无论是模型还是单元格视图模型)