Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 多次调用UITableViewCell中的禁用/启用UIButton_Ios_Uitableview_Uibutton - Fatal编程技术网

Ios 多次调用UITableViewCell中的禁用/启用UIButton

Ios 多次调用UITableViewCell中的禁用/启用UIButton,ios,uitableview,uibutton,Ios,Uitableview,Uibutton,这是一个相当简单的情况: 我有一个自定义的UITableViewCell类,它有自己的属性、插座等。其中有两个ui按钮-->喜欢和不喜欢。您可以将它们视为喜欢或不喜欢的注释按钮 我像这样向它们添加了iActions(在TableViewController中,而不是在CustomCell类中): 在CellForRowAtIndexPath中,我检查是否选择了当前项目的用户默认值,如果选择了,我将禁用按钮(您可以喜欢或不喜欢,而不是两者都喜欢,因此需要禁用所有按钮): 在这里,调用适当的单元格i

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

我有一个自定义的UITableViewCell类,它有自己的属性、插座等。其中有两个ui按钮-->喜欢不喜欢。您可以将它们视为喜欢或不喜欢的注释按钮

我像这样向它们添加了iActions(在TableViewController中,而不是在CustomCell类中):

在CellForRowAtIndexPath中,我检查是否选择了当前项目的用户默认值,如果选择了,我将禁用按钮(您可以喜欢或不喜欢,而不是两者都喜欢,因此需要禁用所有按钮):

在这里,调用适当的单元格indexath,获取的行的item和item的ID是正确的

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


有什么建议或链接吗?或者如何将这些按钮与操作和位置正确连接。

这是因为表格单元格被重用。查看
UITableView
的文档了解更多信息。要解决此问题,请维护表中某个索引的按钮是否需要在其他位置启用或禁用的信息,然后在
tableView:cellforrowatinexpath:

中启用/禁用它们。我刚刚遇到同样的问题,并找到了一个简单的解决方法。所选答案不正确。您已经在维护表的某个索引的按钮是否需要在其他地方通过使用该ID的NSDefault来启用或禁用的信息

解决这一问题的方法是

cellForRowAtIndexPath:
就在你的

if((/* get NSUserDefault for the ID*/) == YES){
[cell.likeButton setEnabled:NO];
[cell.dislikeButton setEnabled:NO];
}

始终启用按钮。将此代码放在else语句中也有效


注意:这是可行的,但不是最好的解决方案。

这是解决此问题的另一个完美解决方案……

在tableView的CellForRowAtIndexpath方法中,首先设置按钮的标记

cell.Yourbutton.tag = [Indexpath row];
- (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);

}
//调用UIButton事件

[cell.youbutton addTarget:self action:@selector(likeEvent:) forControlEvents:UIControlEventTouchUpInside];
//方法声明

cell.Yourbutton.tag = [Indexpath row];
- (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);

}

我知道这些单元是重复使用的,这就是这个问题的原因。我不会基于
indexPath.row
值禁用按钮,而是将项的ID保存为用户默认值。在
tableView:cellforrowatinexpath:
中,我首先检查用户默认值,如果有id,则禁用按钮。但是,它仍然会禁用多个单元格。谢谢@Sam的回答。我已经通过使用标签解决了这个问题。答案现在已编辑。如果您已找到此问题的答案,请将其添加为此问题的答案(且仅为答案)。无需编辑问题以包含答案。