具有覆盖视图的UITableView更新错误的索引路径

时间:2016-02-15 12:15:52

标签: ios uitableview

我在主控制器中有一个tableview,其自定义单元格包含3-4个按钮..请参见屏幕截图enter image description here 当按钮被按下时,它会填充一个小的tableview,当我选择新的tableview行时,它不能正常工作,我希望看到截图enter image description here

现在问题是它将new tableview的选定值设置为oldtableview相同的索引

这是代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"FollowUp";
    UITableViewCell *cell ;//= [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] ;
    if (tableView == tblScribedBy) {
        [cell.textLabel setText:[arrScribedBy objectAtIndex:indexPath.row]];
        [cell.textLabel sizeToFit];
    }
    if (tableView == tblDropDown) {
        if ([btnCLicked isEqualToString:@"Cell"]) {
            [cell.textLabel setText:[totalRows objectAtIndex:indexPath.row]];
            [cell.textLabel sizeToFit];
        }
        else if ([btnCLicked isEqualToString:@"Drop"]){
            [cell.textLabel setText:[arrFUDrop objectAtIndex:indexPath.row]];
        }
    }
    if (tableView == tblView) {
        FUCellView * cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
        if (!cell)
        {
            [tblView registerNib:[UINib nibWithNibName:@"FUCellView" bundle:nil] forCellReuseIdentifier:@"myCell"];
            cell = [tblView dequeueReusableCellWithIdentifier:@"myCell"];
            }
        [cell.btntfFUCell addTarget:self action:@selector(actionTfCellFU:) forControlEvents:UIControlEventTouchUpInside];
        [cell.btntfFUCell setTag:indexPath.row];
        [cell.btnDropFU addTarget:self action:@selector(actionDropFU:) forControlEvents:UIControlEventTouchUpInside];
        [cell.btnDropFU setTag:indexPath.row];

         return cell;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    FUCellView *cell = (FUCellView *)[tblView cellForRowAtIndexPath:indexPath];

     if ( tableView == tblScribedBy) {
       [self.btnScribedBy setTitle:[NSString stringWithFormat:@" %@",[arrScribedBy objectAtIndex:indexPath.row]] forState:UIControlStateNormal  ];
         [tblScribedBy setHidden:TRUE];
    }

   else if (tableView == tblDropDown) {
        if ([btnCLicked isEqualToString:@"Cell"]) {
            [cell.tfFUCell setText:[totalRows objectAtIndex:indexPath.row]];
        }
        else if ([btnCLicked isEqualToString:@"Drop"]){
            [cell.btnDropFU setTitle:[arrFUDrop objectAtIndex:indexPath.row] forState:UIControlStateNormal];
        }
       [tblDropDown setHidden:YES];
    }

}

//----- Action for Buttons 
-(void)actionTfCellFU:(UIButton *)sender
{
    btnCLicked = @"Cell";
     [tblDropDown setHidden:FALSE];
    [tblDropDown reloadData];
}
-(void)actionDropFU:(UIButton *)sender
{
    btnCLicked = @"Drop";
    [tblDropDown setHidden:FALSE];
    [tblDropDown reloadData];

}

1 个答案:

答案 0 :(得分:0)

  

FUCellView *cell = (FUCellView *)[tblView cellForRowAtIndexPath:indexPath];

此行用于获取要更新的单元格,但它使用在第二个表视图上选择的索引路径来获取第一个表视图上的目标单元格。因此,您会收到索引错误,并且更新了错误的单元格。

当调用actionDropFU:时,您需要确定一种存储方式,作为实例变量,存储所选单元格的索引路径。这是表1上的索引路径,是您在稍后从第二个表设置选择结果时要用于更新的路径。通常,您不应该直接更新单元格,应该更新数据模型。

最好的选择是不只是将目标和选择器添加到单元格上的按钮。相反,将单元格子类化并向其添加属性,以便稍后在与其进行交互时可以访问它们。单元格应该是按钮单击的目标,当按下按钮时,它应该回调到视图控制器(作为单元格委托或目标),传递配置的数据(索引路径)。