CollectionView中的项目暂时"混乱"当reloadData:在事件处理程序中调用

时间:2014-07-24 19:44:12

标签: ios uiviewcontroller

我有以下情况:

  • 我有一个CollectionView,其每个单元格都包含一个按钮
  • 在cellForItemAtIndexPath:中,我在每个按钮上设置一个字符串,具体取决于单元格的[indexPath row]
  • 在按钮的action方法中,我在CollectionView上调用reloadData :(因为我需要更新按钮文本所代表的信息)
  • 一会儿,当按下按钮时,CollectionView中的单元格显示为“混乱”。 (一旦按钮被释放,一切都恢复到“正常”,并且单元格按照正确的顺序出现:因此,就应用程序而言,这最终是一个美学问题。)

具体来说,我们有这样的代码:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    MyCell *cell = (MyCell *) [collectionView dequeueReusableCellWithReuseIdentifier: @"MyCellType" forIndexPath: indexPath];
    NSString *str = [NSString stringWithFormat:@"%d", [indexPath row]];
    [cell.answerButton setTitle: str forState:UIControlStateNormal];
    // Set tag on button to mark which row no
    // Set button background image depending on some internal data
    return cell;
}

- (IBAction)answerButtonPressed:(id)sender {
    UIButton *button = (UIButton *) sender;
    // look at button tag, decide which button pressed, update internal
    // data which might mean we need to change button colours
    [_collectionView reloadData];
}

我尝试调用reloadData:在dispatch_async中“延迟”更新(我来自Java背景,并且在SwingUtilities.invokeLater()中放置UI更新有时可以帮助这样的情况),但是这没有什么区别。

任何人都可以提供帮助:我做错了什么,或者这只是我必须忍受的UI故障?

1 个答案:

答案 0 :(得分:1)

而不是为整个collectionView重新加载数据,尝试精确定位需要更新的单元格。

- (IBAction)answerButtonPressed:(id)sender {
    UIButton *button = (UIButton *) sender;
    // look at button tag, decide which button pressed, update internal
    // data which might mean we need to change button colours

NSInteger thisTag = button.tag;
NSIndexPath* thisIndexPath = [NSIndexPath indexPathForItem:thisTag inSection:0];
[_collectionView reloadItemsAtIndexPath:@[thisIndexPath]];

}