如何在UICollectionView中添加取消选择但没有多重选择?

van*_*lsh 5 objective-c ios uicollectionview

我目前在视图上有4个不同的集合视图,我想允许取消选择.为此,我必须设置:

//Stop multiple selections on collectionview
self.bagsCollectionView.allowsMultipleSelection = YES;
self.shoesCollectionView.allowsMultipleSelection = YES;
self.dressesCollectionView.allowsMultipleSelection = YES;
self.jewelleryCollectionView.allowsMultipleSelection = YES;
Run Code Online (Sandbox Code Playgroud)

但是我只希望能够从每个集合视图中选择一个单元格.例如,在bagsCollectionView中,用户可以选择一个包,但也可以取消选择并选择另一个包.他们不能挑两个包或两个鞋.其他三个集合视图也一样!

我该怎么做呢?

小智 15

allowsMultipleSelection禁用时,没有内置支持取消选择所选单元格(通过再次点击).但这既有意又直观.默认行为并不是要为您可以切换的开关建模,然后关闭.

当您考虑选择项目(或表格行)的单一选择设计时,当用户想要选择不同的项目(或表格行)时,直观的行为是点击另一个项目(此时原始项目是由系统自动取消选择).在选择其他项目之前,他们不会(考虑需要)点击原始项目以取消选择它.

您可能正在尝试对通常不期望的内容进行建模,并且通过呈现与其他应用程序不同的交互,从UX的角度来看,它会稍微有点迷失方向.用户可能不会有意识地知道什么是错的,但它可能会影响整个应用体验.这可能代表设计问题(以及涉及一些不必要的代码).

如何处理您的要求

要实现取消选择但强制执行单选,您需要启用多个选择,然后在进行新选择时强制取消选择其他单元格.

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    NSArray *indexPaths = collectionView.indexPathsForSelectedItems;
    // Don't deselect our own index path
    [indexPaths removeObject:indexPath];
    for (NSIndexPath *otherIndexPath in indexPaths) {
        [collectionView deselectItemAtIndexPath:otherIndexPath animated:YES];
    }
    // ... Do whatever else you need to do in response to the selection
}
Run Code Online (Sandbox Code Playgroud)