在 iOS 的 UITableViewCell 中更新 UIButton 图像时发生冲突

Posted

技术标签:

【中文标题】在 iOS 的 UITableViewCell 中更新 UIButton 图像时发生冲突【英文标题】:Having conflicts when update UIButton image within UITableViewCell in iOS 【发布时间】:2014-09-09 19:22:28 【问题描述】:

我有一个应用程序,其中一些帖子放置在 UITableView 上。每个帖子都有一个收藏按钮,当用户点击它时,我需要更改它的图像。代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

static NSString *identifier = @"identifier";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:identifier];

if(cell == nil)
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"myNib" owner:self options:nil];
    cell = [nib objectAtIndex:0];


NSDictionary *post = [posts objectAtIndex:indexPath.row];

[cell.likeButton addTarget:self
                 action:@selector(clickedOnLike:)
      forControlEvents:UIControlEventTouchUpInside];
cell.likeButton.tag = indexPath.row;

在点击处理程序上:

-(IBAction)clickedOnLike:(id)sender


int tag = buttonSender.tag;
NSDictionary *post = [posts objectAtIndex:tag];

if( ![self likedAlready:post] )

    //set liked on this view...

    //update view
    NSLog(@"button: %@",buttonSender);
    [sender setImage:[UIImage imageNamed:@"newImage.png"] forState:UIControlStateNormal];

    //send like to server...
  

此时,一切正常。问题是,单击一个按钮后,更新视图并滚动到其他单元格,我从未单击过的其他按钮视图也会更新。例如,当我单击 indexPath 1 处的按钮时,位于 5 和 9 处的按钮会自动更改其图像。这对我来说是个谜,因为我直接调用动作发送者并只更新它。感谢您的帮助。

【问题讨论】:

由于单元被重用,我认为“addTarget”调用保持静止(可能它们正在堆叠)。也许您应该删除 cellForRowAtIndexPath 开头的控制事件的操作: 【参考方案1】:

可重复使用的单元格:dequeueReusableCellWithIdentifier

你需要手动处理这样的事情。

你可以从CellForRowAtIndexPath:手动调用你的clickedOnLike:方法

尝试在您的模式内部维护(来自您的 MVC 开发架构),并从 CellForRowAtIndexPath: 访问那里

这会解决你的问题:)

祝你好运!

【讨论】:

【参考方案2】:

在你的 cellForRowAtIndexPath 中,设置你的按钮的默认图像,然后如果它是最喜欢的就改变它。这些行往往会被缓存,因此请始终将数据设置为您期望的数据。

【讨论】:

【参考方案3】:

正如其他人所说,问题是因为每行的视图都被回收,并且在回收的副本中,按钮的图片可能已更改为新的。 您需要将帖子的状态保存在内存中的某个位置,并在每次呈现该行时在 cellForRowAtIndexpath 上为按钮设置正确的图像。

或者,如果您的帖子数量很少,只需通过这样做来消除回收

静态 NSString *identifier = nil;

【讨论】:

以上是关于在 iOS 的 UITableViewCell 中更新 UIButton 图像时发生冲突的主要内容,如果未能解决你的问题,请参考以下文章

在每个 UITableViewCell 中显示备用视图 - iOS

在 iOS 14 中更改 UITableViewCell 背景颜色

iOS - 如何在不同的 UITableViewCell 中重用 UIView

在 iOS7 中更新 UITableViewCell 高度

在 UITableviewCell (ios7) 中嵌入的 UITableView 中滚动

iOS - subivew 不能在 UITableViewCell 中居中