可扩展的tableview单元格

时间:2014-02-12 15:28:57

标签: ios iphone objective-c uitableview

我当前的tableview会在点击时展开单元格,例如:

Parent 0

   -Child 1

   -Child 2

   -Child 3

我正在努力做的是,当我扩展一个单元格时所有其他单元格将关闭,我正在努力确保当时只有一个单元格是打开的。你们能否就如何做到这一点提出任何想法?

扩展单元格的当前代码:

- (void)tableView:(UITableView *)tableView1 didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section==0) {

    if([d valueForKey:@"produtos"]) {
        NSArray *ar=[d valueForKey:@"produtos"];

        BOOL isAlreadyInserted=NO;

        for(NSDictionary *dInner in ar ){
            NSInteger index=[self.firstForTable indexOfObjectIdenticalTo:dInner];
            isAlreadyInserted=(index>0 && index!=NSIntegerMax);
            if(isAlreadyInserted) break;
        }

        if(isAlreadyInserted) {
            [self miniMizeFirstsRows:ar];
        } else {
            NSUInteger count=indexPath.row+1;
            NSMutableArray *arCells=[NSMutableArray array];
            for(NSDictionary *dInner in ar ) {
                [arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]];
                [self.firstForTable insertObject:dInner atIndex:count++];
            }

            [tableView1 beginUpdates];
            [tableView1 insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationNone];
            [tableView1 endUpdates];
            [tableView1 scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

        }

    }else{
        NSLog(@"child %@ %@|",[item valueForKey:@"nome"],[item valueForKey:@"produtos"]);
    }
}

最小化单元格的当前代码:

-(void)miniMizeFirstsRows:(NSArray*)ar{
NSLog(@"miniMizeFirstsRows");
for(NSDictionary *dInner in ar ) {
    NSUInteger indexToRemove=[self.firstForTable indexOfObjectIdenticalTo:dInner];
    NSArray *arInner=[dInner valueForKey:@"produtos"];
    if(arInner && [arInner count]>0){
        [self miniMizeFirstsRows:arInner];
    }

    if([self.firstForTable indexOfObjectIdenticalTo:dInner]!=NSNotFound) {
        [self.firstForTable removeObjectIdenticalTo:dInner];
        [tableView beginUpdates];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:
                                                [NSIndexPath indexPathForRow:indexToRemove inSection:0]
                                                ]
                              withRowAnimation:UITableViewRowAnimationFade];
         [tableView endUpdates];
    }
  }
}

先谢谢。

编辑仍然无法正常工作 我所拥有的,通过使用Marco的帮助回答:

 NSLog(@"indexPath1 = %i",selectedRow);

        NSDictionary *d=[self.firstForTable objectAtIndex:indexPath.row];
        if([d valueForKey:@"Objects"]) {
            NSArray *ar=[d valueForKey:@"Objects"];

            NSUInteger count=indexPath.row +1;
            NSMutableArray *arCells=[NSMutableArray array];
            for(NSDictionary *dInner in ar ) {
                [arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]];
                [self.firstForTable insertObject:dInner atIndex:count++];
            }
            [tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft];
            //   }
        }else
        {
            NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"name"],[d valueForKey:@"book"]);
        }

    // The user is selecting the cell which is currently expanded
    // we want to minimize it back
    if (selectedRow == row)
    {

        NSLog(@"selectedRow2 = %i",selectedRow);

        NSDictionary *d=[self.firstForTable objectAtIndex:selectedRow];
        if([d valueForKey:@"Objects"]) {
            NSArray *ar=[d valueForKey:@"Objects"];

            [self miniMizeFirstsRows:ar];

        }

        selectedRow = -1;

        return;
    }

    // First we check if a cell is already expanded.
    // If it is we want to minimize make sure it is reloaded to minimize it back
    if (selectedRow >= 0)
    {

        NSLog(@"selectedRow3 = %i",selectedRow);

        NSDictionary *d=[self.firstForTable objectAtIndex:selectedRow];
        if([d valueForKey:@"Objects"]) {
            NSArray *ar=[d valueForKey:@"Objects"];

            [self miniMizeFirstsRows:ar];

        }
        selectedRow = row;
    }

    // Finally set the selected index to the new selection and reload it to expan
    selectedRow = row;
    [tableView beginUpdates]; [tableView endUpdates];
}

请多多帮助:)

2 个答案:

答案 0 :(得分:1)

Marco的答案中缺少的一件事是“heightForRowAtIndexPath”委托方法的实现。 所以这些是您需要遵循的步骤:

  1. 创建一个记录所选行号的变量
  2. 选择行时更新该变量(在“didSelectRowAtIndexPath”委托方法中)并调用tableView的 beginUpdates & endUpdates 方法。
  3. indexPath.row == selectedRow 时返回更大的高度,否则返回正常高度。

答案 1 :(得分:-1)

您需要一个实例变量来跟踪您选择的单元格。

注意:下面的代码并不是要替换tableview数据源和委托方法,而是作为跟踪所选单元格的示例:

NSInteger selectedRow实例变量添加到视图控制器。

viewDidLoad中,初始化selectedRow表示不会扩展细胞:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set set our selectedRow to -1 to indicate no cell will be expanded
    selectedRow = -1;
}

tableView:didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    NSInteger row = indexPath.row;

    // The user is selecting the cell which is currently expanded
    // we want to minimize it back
    if (selectedRow == row)
    {
        selectedRow = -1;
        [tableView beginUpdates]; [tableView endUpdates];

        return;
    }

    // First we check if a cell is already expanded.
    // If it is we want to minimize make sure it is reloaded to minimize it back
    if (selectedRow >= 0)
    {
        selectedRow = row;
    }

    // Finally set the selected index to the new selection and reload it to expand
    selectedRow = row;
    [tableView beginUpdates]; [tableView endUpdates];
}