禁用/启用多次调用UITableViewCell内的UIButton

时间:2012-11-15 11:07:00

标签: ios uitableview uibutton

这是一个相当简单的情况:

我有自定义的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是正确的。

问题在于,除了当前选择的按钮之外,随机按钮(在一些重用的单元格中)也被选中(禁用)。如果我尝试通过插座禁用它们,则会发生同样的事情。当然,这是不可接受的。我已经尝试了各种各样的组合,但显然我错误的想法。

有任何建议或链接吗?或者如何正确地将这些按钮与动作和位置连接起来。

3 个答案:

答案 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语句中也可以。

注意:这有效,但不是最佳解决方案。