0

我有这样的问题:

  • 我有一个表格视图。当我单击一个单元格(或行)时,该单元格将再添加 2 个按钮并重新调整大小。
    • 这个功能很好用!
  • 问题是当我点击第一行时,
    • 它创建 2 个按钮并重新调整大小
    • 然后向下滚动,另一个单元格也显示 2 个按钮。
    • 这是我的显示按钮和调整单元格大小的代码
  • 我相信向下滚动表格时会重新加载并重置 indexPath,因此 2 个单元格都显示按钮。有人有什么建议吗!?

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    tvcCategory *cell = (tvcCategory*)[tableView cellForRowAtIndexPath:indexPath];
    NSLog(@"- %i ", indexPath.item);
    if (selectedIndex.item != indexPath.item) {

        [btnEdit removeFromSuperview];
        [btnTransact removeFromSuperview];

        objSession.catId = cell.lblId.text;
        btnEdit = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        btnEdit.frame = CGRectMake(91, 72, 73, 35);
        [btnEdit setTitle:@"Edit" forState:UIControlStateNormal];
        [btnEdit setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [btnEdit setBackgroundImage:buttonImage forState:UIControlStateNormal];
        [btnEdit setBackgroundImage:buttonImageHighlight forState:UIControlStateHighlighted];
        [btnEdit addTarget:self action:@selector(moveToEditingScreen)  forControlEvents:UIControlEventTouchUpInside];

        btnTransact = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        btnTransact.frame = CGRectMake(176, 72, 95, 35);
        [btnTransact setTitle:@"Transact" forState:UIControlStateNormal];
        [btnTransact setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [btnTransact setBackgroundImage:buttonImage forState:UIControlStateNormal];
        [btnTransact setBackgroundImage:buttonImageHighlight forState:UIControlStateHighlighted];
        [btnTransact addTarget:self action:@selector(moveToTransactionScreen) forControlEvents:UIControlEventTouchUpInside];


        [tableView reloadData];
        [cell.contentView addSubview:btnEdit];
        [cell.contentView addSubview:btnTransact];
        lastClickedCell = cell;
        self.selectedIndex = indexPath;

        NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:-1 inSection:0];
        NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
        [tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationFade];
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;

    }
    else
    {
        [tableView reloadData];
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    }
}

我真的很感激

4

1 回答 1

0

您面临的问题,就像这些人在评论中所暴露的那样,在表格视图方法中,您需要重用单元格来优化性能,因此您需要获取已经使用过的单元格并将其调整为您的预期细胞状态。

可能在您的情况下,cellForRowAtIndexPath您只是注意分配它并在没有单元格时对其进行调整,您将需要对其进行调整,您有一些选择,例如始终将其调整为初始状态,或者您可以检查按钮是否显示并且仅在这种情况下重新设计您的单元格。

所以在你的课堂上,在某些时候你有这个方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    } else {
        if([selectedIndex isEqual:indexPath]){
           //Add your buttons and adjust the cell to show the extra buttons
        } else {
           if(your selected index isn't in the screen anymore){
               [btnEdit removeFromSuperview];
               [btnTransact removeFromSuperview];
           }
           //your others adjusts
        }

    }
}

编辑:

[[yourTable indexPathsForVisibleRows] containsObject:selectedIndexPath];

此方法返回一个数组,您需要检查您的 selectedindex 是否在其中。您可以在文档中找到有关 UITableView 的更多信息。

于 2013-05-24T22:11:46.427 回答