无论在 UICollectionView 中选择啥 IndexPath,只有最后一个单元格会被突出显示

Posted

技术标签:

【中文标题】无论在 UICollectionView 中选择啥 IndexPath,只有最后一个单元格会被突出显示【英文标题】:Only The Last Cell Gets Highlighted No Matter What IndexPath is Selected in UICollectionView无论在 UICollectionView 中选择什么 IndexPath,只有最后一个单元格会被突出显示 【发布时间】:2018-06-11 08:49:01 【问题描述】:

这是一件如此疯狂的事情,我只是不明白。

我有一个装满图像的 UICollectionView。我希望能够选择一个图像并在其周围绘制一个红色边框(或添加一个 x、更改 alpha 或对其执行任何操作)。但无论我做什么或将代码放在哪里,只有视图中的最后一个图像会获得红色边框。选择单元格后,一切都按预期执行-(删除了正确的图像(正确的索引路径中的图像),重新加载了集合视图,并更新了文档目录)。为什么我不能突出显示正确的图像?

我确实有一个 TapGestureRecognizer 来实现绘制边框,如果这会有所不同,但是当我从按钮按下调用代码时它正在做同样的事情,在这种情况下,预计所有单元格都会有一个红色边框,但这也没有发生。只有最后一个单元格有边框???

为了清楚起见,假设 collectionview 中有九张图像。我可以点击索引 0,但只有索引 8 有红色边框。如果我点击索引 1 到 8 本身也是一样的,只有索引 8 会获得边框。

我尝试的另一件事是在每个单元格上设置一个 x 的图像,并在呈现集合视图时将其隐藏。当在所选索引处点击图像时,我试图取消隐藏它。同样的事情也会发生。当一个单元格被点击时,最后一个单元格获得 x 而不是选定的单元格!什么鬼?

我所有的 NSLogs 都表明正在读取正确的索引路径,并且在最终结果中得到证明,因为所有内容都已更新,但如果无法突出显示正确的单元格,则用户体验不佳。

我会非常感谢任何关于这种荒谬的想法。

单元格以正常方式填充:

_cell.bookImageView.image = [_book.imageArray objectAtIndex:indexPath.row];

这是 cellForItemAtIndexPath 中的点击手势:

UITapGestureRecognizer *deleteImageTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(deleteImageTapped:)];
deleteImageTap.numberOfTapsRequired = 2;
 _cell.bookImageView.tag = indexPath.row;
 [_cell.bookImageView addGestureRecognizer:deleteImageTap];
 _cell.bookImageView.userInteractionEnabled = YES;

这就是我想要做的:

_cell.layer.borderColor = [UIColor yellowColor].CGColor;
_cell.layer.borderWidth = 2;

甚至是这样:

_cell.alpha = 0.4;

我尝试过代码的几个地方:

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

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

//my tap gesture method
-(void)deleteImageTapped:(UITapGestureRecognizer *)gesture

//how I get the indexpath in my method
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:gesture.view.tag inSection:0];

【问题讨论】:

【参考方案1】:

我非常了解您的问题。 我建议你在 CellForRowAtIndexPath 中使用一个按钮,而不是 UiTapGesture。

首先在您的单元格中添加按钮。

cell.yourbutton.tag = indexPath.row;

[cell.yourbutton addTarget:self action:@selector(yourButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

-(void)yourButtonClicked:(UIButton*)sender

如果 (sender.tag == 0)

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:sender.tag inSection:0];

【讨论】:

感谢您的回答,但添加按钮不会改变行为。 (我又试了一次)。此外,在 UITableView 中使用了 CellForRowAtIndexPath。您是说 cellForItemAtIndexPath 吗?即便如此,它仍然打得不好。【参考方案2】:

事实证明,我只需要在 didHighlightItemAtIndexPath 和 didUnhighlightItemAtIndexPath 中“提及”我的单元格。但无论出于何种原因,这里从未调用过向单元格添加更改。

我将 UITapGestureRecognizer 留在了我的 cellForItemAtIndexPath 中,并在从我的点击手势调用的方法中添加了对单元格的更改。

基本设置如下:

@property (nonatomic, strong) CollectionViewCell *cell;


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

   _cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

   if (!_cell.selected)
    
        //this "turns off" the cell changes
        _cell.alpha = 1.0;
        _cell.deleteButton.alpha = 0.0;
        _cell.bookImageView.layer.borderColor = nil;
        _cell.bookImageView.layer.borderWidth = 0;
    

   UITapGestureRecognizer *deleteImageTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(deleteImageTapped:)];
    deleteImageTap.numberOfTapsRequired = 2;
    _cell.bookImageView.tag = indexPath.row;
    [_cell.bookImageView addGestureRecognizer:deleteImageTap];
    _cell.bookImageView.userInteractionEnabled = YES;

   return _cell;



-(void)deleteImageTapped:(UITapGestureRecognizer *)gesture

    _cell.alpha = 0.4;
    _cell.deleteButton.alpha = 1.0;
    _cell.bookImageView.layer.borderColor = [UIColor redColor].CGColor;
    _cell.bookImageView.layer.borderWidth = 5;


   //more code to delete image blah blah blah

这就是我“提到”我的细胞的地方

- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath

    _cell = (CollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];


- (void)collectionView:(UICollectionView *)colView  didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath

    _cell = (CollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];

希望这可以帮助别人!

【讨论】:

以上是关于无论在 UICollectionView 中选择啥 IndexPath,只有最后一个单元格会被突出显示的主要内容,如果未能解决你的问题,请参考以下文章

无论选择啥选项,函数“void sub(int Subtraction)”都会保持打印[关闭]

收到内存警告时 UICollectionView 维护的单元队列会发生啥?

我应该使用啥,UITableView 或 UICollectionView? [关闭]

jQuery ComboBox:无论我尝试啥,我都无法将值返回到我的选择框(无法以编程方式选择所需的选项)

对单列使用 UICollectionView 有啥缺点?

UICollectionView:contentSize和bounds有啥区别?