滚动时单元格重复。我应该怎么做才能预防它?
Duplicated cell when scrolling. What should I do in order to prevent it?
我是 iOS 编程语言的新手。我尝试在每一行中使用 table 和按钮。
- 当我点击第一个单元格中的按钮时,效果很好。
- 但是当我向下滚动时,我没有点击的单元格也出现了点击。
我想只在我点击的单元格中显示点击的按钮吗?
代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
ClassifyCustomCell * cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if ([[[arrayResult objectAtIndex:indexPath.row] objectForKey:@"COLABO_FLD_SRNO"] isEqualToString:@"I"]) {
cell.editButton.hidden = YES;
cell.folder_name.text = [[arrayResult objectAtIndex:indexPath.row] objectForKey:@"COLABO_FLD_NM"];
}else{
cell.editButton.hidden = NO;
cell.folder_name.text = [[arrayResult objectAtIndex:indexPath.row] objectForKey:@"COLABO_FLD_NM"];
cell.editButton.tag = indexPath.row;
[cell.editButton addTarget:self action:@selector(editButtonAction:) forControlEvents:UIControlEventTouchUpInside];
cell.checkButton.tag = indexPath.row;
[cell.checkButton addTarget:self action:@selector(checkButtonActoin:) forControlEvents:UIControlEventTouchUpInside];
}
return cell;
}
-(void)checkButtonActoin:(UIButton *)sender{
if (sender.selected == YES) {
sender.selected = NO;
}else if(sender.selected == NO){
sender.selected = YES;
}else {
sender.selected = NO;
}
}
UITableView 为新单元格重用单元格子视图的状态。为了防止重复使用,只需在 tableView:cellForRowAtIndexPath:
中明确配置您的子视图。在您的情况下,您需要将按钮的 selected
属性 设置为 YES
,如果它被选中,如果它没有被选中则设置为 NO
。
将 NSMutableArray 属性 添加到您的视图控制器:
@property (strong, nonatomic) NSMutableArray *arrayForSelectedIndexPaths;
更改您的点击方式:
-(void)checkButtonAction:(UIButton *)sender{
UITableViewCell *cell = (UITableViewCell *) sender.superview.superview...; //find appropriate number of superviews to get your cell
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
if (sender.selected) {
sender.selected = NO;
[self.arrayForSelectedIndexPaths removeObject:indexPath];
}else {
sender.selected = YES;
[self.arrayForSelectedIndexPaths addObject:indexPath];
}
}
然后在tableView:cellForRowAtIndexPath:
中添加这一行:
cell.checkButton.selected = [self.arrayForSelectedIndexPaths containsObject:indexPath];
我是 iOS 编程语言的新手。我尝试在每一行中使用 table 和按钮。
- 当我点击第一个单元格中的按钮时,效果很好。
- 但是当我向下滚动时,我没有点击的单元格也出现了点击。
我想只在我点击的单元格中显示点击的按钮吗? 代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
ClassifyCustomCell * cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if ([[[arrayResult objectAtIndex:indexPath.row] objectForKey:@"COLABO_FLD_SRNO"] isEqualToString:@"I"]) {
cell.editButton.hidden = YES;
cell.folder_name.text = [[arrayResult objectAtIndex:indexPath.row] objectForKey:@"COLABO_FLD_NM"];
}else{
cell.editButton.hidden = NO;
cell.folder_name.text = [[arrayResult objectAtIndex:indexPath.row] objectForKey:@"COLABO_FLD_NM"];
cell.editButton.tag = indexPath.row;
[cell.editButton addTarget:self action:@selector(editButtonAction:) forControlEvents:UIControlEventTouchUpInside];
cell.checkButton.tag = indexPath.row;
[cell.checkButton addTarget:self action:@selector(checkButtonActoin:) forControlEvents:UIControlEventTouchUpInside];
}
return cell;
}
-(void)checkButtonActoin:(UIButton *)sender{
if (sender.selected == YES) {
sender.selected = NO;
}else if(sender.selected == NO){
sender.selected = YES;
}else {
sender.selected = NO;
}
}
UITableView 为新单元格重用单元格子视图的状态。为了防止重复使用,只需在 tableView:cellForRowAtIndexPath:
中明确配置您的子视图。在您的情况下,您需要将按钮的 selected
属性 设置为 YES
,如果它被选中,如果它没有被选中则设置为 NO
。
将 NSMutableArray 属性 添加到您的视图控制器:
@property (strong, nonatomic) NSMutableArray *arrayForSelectedIndexPaths;
更改您的点击方式:
-(void)checkButtonAction:(UIButton *)sender{
UITableViewCell *cell = (UITableViewCell *) sender.superview.superview...; //find appropriate number of superviews to get your cell
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
if (sender.selected) {
sender.selected = NO;
[self.arrayForSelectedIndexPaths removeObject:indexPath];
}else {
sender.selected = YES;
[self.arrayForSelectedIndexPaths addObject:indexPath];
}
}
然后在tableView:cellForRowAtIndexPath:
中添加这一行:
cell.checkButton.selected = [self.arrayForSelectedIndexPaths containsObject:indexPath];