在 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