当我在表格视图中单击2个单元格时自动折叠1个单元格

时间:2016-10-20 06:35:19

标签: ios uitableview ipad tableviewcell

我已经编写了扩展和折叠的代码,这里我的问题是,在表格视图中,当我点击第一个单元格时,它正在正确扩展,但是当我点击第二个单元格时,自动第一个单元格正在折叠。 我的代码是

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(isFilter)
    {
        return [searchArray count];
    }
    else
        return  [responceArray count];
}




-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"Content1"];
    if(!cell)
    {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Content1"];
        
    }
    
        UILabel *namelab = (UILabel *)[cell viewWithTag:1];
        UILabel *state = (UILabel *)[cell viewWithTag:2];
        UILabel *status = (UILabel *)[cell viewWithTag:4];
        UILabel *serialNo=(UILabel *)[cell viewWithTag:8];
        UILabel *company = (UILabel *)[cell viewWithTag:5];
        UIView *aview=(UIView *)[cell.contentView viewWithTag:10];
    if(isFilter)
    {
        
        serialNo.text=[NSString stringWithFormat:@"%@",[[searchArray objectAtIndex:indexPath.row] valueForKey:@"job_id"]];
         namelab.text=[[searchArray objectAtIndex:indexPath.row]valueForKey:@"maintenance_friendly_name"];
        state.text=[[searchArray objectAtIndex:indexPath.row]valueForKey:@"site_id"];
        status.text=[[searchArray objectAtIndex:indexPath.row]valueForKey:@"maintenance_status"];
        company.text=[[searchArray objectAtIndex:indexPath.row]valueForKey:@"orgname"];
    }
    else
    {
        serialNo.text=[NSString stringWithFormat:@"%@",[[responceArray objectAtIndex:indexPath.row] valueForKey:@"job_id"]];
        namelab.text=[[responceArray objectAtIndex:indexPath.row]valueForKey:@"maintenance_friendly_name"];
        state.text=[[responceArray objectAtIndex:indexPath.row]valueForKey:@"site_id"];
        status.text=[[responceArray objectAtIndex:indexPath.row]valueForKey:@"maintenance_status"];
        company.text=[[responceArray objectAtIndex:indexPath.row]valueForKey:@"orgname"];
    
}
    //alternative background colors for better division ;)
    
    if (indexPath.row %2 ==1)
        cell.backgroundColor = [UIColor colorWithRed:.9 green:.9 blue:.9 alpha:1];
    else
        cell.backgroundColor = [UIColor colorWithRed:.8 green:.8 blue:.8 alpha:1];
    
    // name.text = [cellTitles objectAtIndex:indexPath.row];
    
    if (isTagsExapanded == YES && isSelectedRowIndex == indexPath.row) {
        
        
        cell.contentView.frame = CGRectMake(0, 0,self.view.frame.size.width,160);
        
        aview.backgroundColor=[UIColor lightGrayColor];
        
        [cell.contentView viewWithTag:3].transform = CGAffineTransformMakeRotation(0);
        
    }else{
        cell.contentView.frame = CGRectMake(0, 0,self.view.frame.size.width,160);
        aview.backgroundColor=[UIColor colorWithRed:1.00 green:1.00 blue:1.00 alpha:1.0];

    }
    
    return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    if (isTagsExapanded && isSelectedRowIndex == indexPath.row) {
        
        return 160;
        
    }else{
        
        return  75;
        
    }
    return 0;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    
    if (!isTagsExapanded ) {
        
        isTagsExapanded = YES;
        isSelectedRowIndex = indexPath.row;
        
    }else{
        
        isTagsExapanded = NO;
        
    }
    [_collapeExpandUITBV reloadData];

}

3 个答案:

答案 0 :(得分:1)

确认此属性是单个单元格属性或整个表格属性。

答案 1 :(得分:1)

这是因为您的isTagsExapandedisSelectedRowIndex属性似乎是整个类的常见属性或单例属性,因此如果您选择任何一行,则if部分将被执行,而isTagsExapanded部分将被执行设置为YES,当你的表重新加载时,它会根据你的数据源和委托方法进行扩展,当你第二次选择任何单元格然后isTagsExapanded设置为NO并重新加载表集tableview没有扩展行。

因此,每当使用tap单元格并且您正在设置isSelectedRowIndex并重新加载表格cellforrow时,表格单元格仅在isSelectedRowIndex展开,而所有其他单元格因if (isTagsExapanded == YES && isSelectedRowIndex == indexPath.row)而设置为折叠状态1}}这种情况。当isSelectedRowIndex == indexPath.row在那时变为真时,只有你的细胞会膨胀。

因此,如果您希望扩展扩展的单元格,那么您应该为扩展的单元格管理indexPath的数组。对于该数组的每个索引路径(所选索引路径或选定行或扩展单元格的数组),在cellForRowAtIndexPathheightforrow set expanded frame and 160 height中。

你可以获得类似的索引路径数组

   NSArray *arr = [yourTableView indexPathsForSelectedRows];

答案 2 :(得分:1)

由于isSelectedRowIndex属性,您的第一个单元格被禁用。一次只能保存一个索引,因此只有一个单元格会显示为展开,其他单元格将根据您的代码折叠。

根据您的要求,需要维护一系列选定的单元格索引。这是可以帮助你的代码。

在ViewController.h文件中(或在类别定义中的ViewController.m文件中)

NSMutableArray *selectedCellIndexes;

在ViewController.m文件中:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

   if (selectedCellIndexes == nil) {
      selectedCellIndexes = [[NSMutableArray alloc] init];
   }

   if(![selectedCellIndexes containsObject:[NSNumber numberWithInteger:indexPath.row]])
    {
        [selectedCellIndexes addObject:[NSNumber numberWithInteger:indexPath.row]];  // add if it does not exist
    }
    else
    {
        [selectedCellIndexes removeObject:[NSNumber numberWithInteger:indexPath.row]];  // remove if it exists
    }
    [tableView reloadData];  // redraw all cell again
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Cell alloc - init data here
   ...
   ...

   if(selectedCellIndexes && [selectedCellIndexes containsObject:[NSNumber numberWithInteger:indexPath.row]])    
   {
      // expanded cell code here
   }
   else {
      // collapsed cell code here
   }
   return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
   int rowHeight = 0;
   if(selectedCellIndexes && [selectedCellIndexes containsObject:[NSNumber numberWithInteger:indexPath.row]]) 
        rowHeight = EXPANDED_CELL_HEIGHT; // define this value as constants 
   }
   else 
   {     
      rowHeight = COLLAPSED_CELL_HEIGHT; // define this value as constants 
   }
   return rowHeight;
}

希望这有帮助。