29

我在 CollectionView 中有多个项目,但只有少数项目应该是可选的。我正在使用委托方法处理此问题:

- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath

如果选择了一个可选择的项目并且在下一步中选择一个不可选择的项目被 shouldSelectItemAtIndexPath 返回 NO 拒绝,那么我的问题就会出现,无论如何,选定的项目都会被取消选择。

我也尝试过使用

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath

但这是同样的问题。

这是 UICollectionView 的正确期望行为吗?如果是,如果选择了不可选择的项目,我如何避免取消选择我最后选择的项目?

4

7 回答 7

13

我必须纠正我的假设:最后的选择不会被取消选择!

为了在选择时更改单元格的外观,我重写了 UICollectionViewCell 的 setSelected 访问器。选择不可选择的项目时,最后一个选定单元格的访问器 setSelected 会被多次调用。首先是状态 NO,然后是状态 YES,最后是 NO。最后一个状态 NO 导致我的单元格将其外观设置为未选定单元格的外观。

我不知道这种奇怪行为的原因,也无法解决。

我的解决方法是直接在 ViewController 中更改选定单元格的外观。

将选定的外观设置为:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

删除选定的外观:

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath

检查是否选择了当前单元格并按预期更改外观。

   - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
于 2013-01-23T12:21:32.130 回答
4

晚了 6 年,但可能对其他人有帮助。在这种情况下,首先不应该选择某些单元格,可以简单地添加isUserInteractionEnabled = false到 customUICollectionViewCellawakeFromNib()功能。这也可以在 xib 文件中完成,但这不太明确,对未来的维护者来说可能并不明显。

于 2018-12-27T00:38:50.257 回答
3

我刚遇到同样的问题。我尝试了多种解决方案,第一个适用于我的解决方案是重新加载然后重新选择选定的单元格。无论我是重新加载整个集合视图还是只是卡在未选择的外观上的单元格,这都对我有用。

对我不起作用的方法:

  • 将单元格的selected属性设置为 true,或者甚至将其切换为 false,然后再次设置为 true。
  • 通过 选择项目-selectItemAtIndexPath:animated:scrollPosition:,甚至通过取消选择它-deselectItemAtIndexPath:然后再次选择它。
  • 仅重新加载选定的行-reloadItemsAtIndexPaths:
  • 用 重新加载所有内容-reloadData
于 2016-02-11T20:00:24.303 回答
2

我通过设置解决了这个问题self.collectionView.allowsMultipleSelection = true

并在我返回true时取消选择每个索引-collectionView:shouldSelectItemAtIndexPath:

于 2017-09-06T19:55:21.880 回答
1

您应该在委托方法 DidSelect 和 DidDeselect 方法中更改单元格外观。如果在 shouldSelect 方法中返回 NO,则不会调用 DidSelect 和 DidDeselect,因此外观将保持不变,与 collectionView 的选中状态一致。

于 2014-01-10T08:52:40.510 回答
1

我不知道为什么UICollectionView会如此凌乱,相比之下UITableViewController……我发现了一些事情。

- setSelected:被多次调用的原因是因为顺序方法被调用。该顺序与方法的顺序非常相似UITextFieldDelegate

- collectionView:shouldSelectItemAtIndexPath:在实际选择单元格之前调用该方法collectionView,因为它实际上是在询问“应该选择它”吗?

- collectionView:didSelectItemAtIndexPath:实际上是在collectionView选择单元格之后调用的。因此,名称“确实选择了”。

取消选择也是如此。

TL;DR -通过调用collectionView取消选择委托方法中的单元格,一切都会好起来的。- collectionView:shouldSelectItemAtIndexPath:- selectItemAtIndexPath:animated:scrollPosition:

于 2015-04-29T05:31:01.800 回答
0

你有没有尝试过:

- (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath

我发现这可以按预期工作。

于 2013-10-16T16:48:32.430 回答