我有一张桌子视图&自定义单元格。单元格包含3个按钮(复选框类型)。在按钮上单击我需要更改的相应按钮文本(选中/取消选中)。 我实现了这一点,但是当我点击顶部单元格上的第一个按钮并向下滚动时,底部的新单元格也有这个复选标记,当我滚动回到顶部时,复选标记被移动到下一个单元格..如何解决这个问题? ?
代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *strCellIdentifier = @"RemoteCell";
RemoteCustomCell *cell = (RemoteCustomCell*)[tableView ![dequeueReusableCell][2]WithIdentifier:strCellIdentifier];
if (cell == nil) {
cell = [[RemoteCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCellIdentifier];
}
else {
cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCellIdentifier];
}
[cell.btnCheck1 addTarget:self action:@selector(CheckButton1_Click:) forControlEvents:UIControlEventTouchUpInside];
}
return cell;
}
- (void)CheckButton1_Click:(UIButton*)sender
{
RemoteControllCustomCell *clickedCell = (RemoteControllCustomCell *)[[sender superview] superview];
if(clickedCell.btnCheck1.selected)
{
[clickedCell.btnCheck1 setTitle:@"O" forState:UIControlStateNormal];
clickedCell.btnCheck1.selected = NO;
}
else
{
[clickedCell.btnCheck1 setTitle:@"X" forState:UIControlStateSelected];
clickedCell.btnCheck1.selected = YES;
}
}
截图:
答案 0 :(得分:5)
在RemoteCustomCell.m文件中,您应该实现
- (void)prepareForReuse
{
[super prepareForReuse];
cell.btnCheck1.selected = NO;
}
这样重用的每个单元格都会将它的btnCheck1.selected值设置为NO,当你在cellForRowAtIndexPath
中加载单元格时,只有当单元格可见并且你将它设置为时它才会将其设置为YES这一点。
但是将所有值存储在NSMutableArray中是关键。没有将值存储在单元格中的事情,它们会在无法预见的基础上重复使用。将值添加到数组中,然后使用[myArray objectAtIndex:indexPath.row];
在单元格中打开这些值。
一个例子:
viewDidLoad中的某个地方
NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:@"1", @"0", @"1", @"1", nil];
在cellForRowAtIndexPath
BOOL yesOrNo = [[myArray objectAtIndex:indexPath.row] boolValue];
然后将button.selected设置为布尔值。
答案 1 :(得分:1)
这是一个典型问题,您依赖UI来完成模型的工作。模型,你应该传递给UITableViewCell
的东西,所以它可以构建,它会告诉它,它应该显示“X”还是“O”。由于您没有这样做,最简单的解决方案是在每次出列时简单地重置单元的状态。
答案 2 :(得分:0)
我认为您需要将状态存储在数组中并检查
中的状态- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
CheckButton1_Click确实改变状态,但是当dequeueReusableCell,它再次从cellForRowAtIndexPath加载。
答案 3 :(得分:0)
好像你已经出现了细胞问题。您可以实施以下cellForRowAtIndexPath
方法。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"RemoteCell";
RemoteCustomCell *cell = (RemoteCustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell==nil) {
NSArray *arrNib=[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
cell= (RemoteCustomCell *)[arrNib objectAtIndex:0];
}
[cell.btnCheck1 addTarget:self action:@selector(CheckButton1_Click:) forControlEvents:UIControlEventTouchUpInside];
return cell;
}