这是一个相当简单的情况:
我有自定义的UITableViewCell类,它有自己的属性,出口和东西。其中有两个UIButton - > 喜欢和不喜欢。您可以将它们视为喜欢或不喜欢评论按钮。
我已经像这样添加了IBActions(在TableViewController中,而不是CustomCell类):
- (IBAction)likeComment:(UIButton *)sender {
CustomTableCell *thisCell = (CustomTableCell *)[[[sender superview] superview] superview]; // to fetch that cell from view
RSSItem *item = [commentsToDisplay objectAtIndex:indexPath.row];
//code to set NSUserDefault value for the comment ID, so it can never be voted for again
[self.tableView reloadData];
}
在CellForRowAtIndexPath中我检查是否选择了当前项目的用户默认值,如果是,我禁用按钮(你可以喜欢或不喜欢,不是两者都有,所以所有按钮都需要被禁用):
if((/* get NSUserDefault for the ID*/) == YES){
[cell.likeButton setEnabled:NO];
[cell.dislikeButton setEnabled:NO];
}
此处调用适当的单元格indexPath,获取的行的项目和项目的ID是正确的。
问题在于,除了当前选择的按钮之外,随机按钮(在一些重用的单元格中)也被选中(禁用)。如果我尝试通过插座禁用它们,则会发生同样的事情。当然,这是不可接受的。我已经尝试了各种各样的组合,但显然我错误的想法。
有任何建议或链接吗?或者如何正确地将这些按钮与动作和位置连接起来。
答案 0 :(得分:3)
这是问题的另一个完美解决方案......
在tableView的CellForRowAtIndexpath方法中,首先设置按钮的标记
cell.Yourbutton.tag = [Indexpath row];
//调用您的UIButton事件
[cell.youbutton addTarget:self action:@selector(likeEvent:) forControlEvents:UIControlEventTouchUpInside];
//方法声明
- (void)likeEvent:(UIButton *)sender
{
UIButton *likeButton = (UIButton *)sender;
if (likeButton.isSelected) {
[likeButton setImage:[UIImage imageNamed:@"like-default.png"] forState:UIControlStateNormal];
}else {
[likeButton setImage:[UIImage imageNamed:@"like-active.png"] forState:UIControlStateSelected];
}
[likeButton setSelected:!likeButton.isSelected];
NSLog(@"like:%d",likeButton.isSelected);
}
答案 1 :(得分:2)
这是因为正在重复使用表格单元格。查看UITableView
的文档以获取有关此内容的更多信息。要解决此问题,请维护以下信息:是否需要在其他位置启用或禁用表格某个索引的按钮,然后在tableView:cellForRowAtIndexPath:
中启用/禁用它们。
答案 2 :(得分:2)
我遇到了同样的问题并找到了一个简单的修复方法。所选答案不正确。您已经通过使用NSDefault为该ID维护了是否需要在其他位置启用或禁用表的某个索引的按钮的信息。
解决此问题的方法是
cellForRowAtIndexPath:
在你的
之前if((/* get NSUserDefault for the ID*/) == YES){
[cell.likeButton setEnabled:NO];
[cell.dislikeButton setEnabled:NO];
}
始终启用按钮。将此代码放在else语句中也可以。
注意:这有效,但不是最佳解决方案。