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

Automatically Collapsing the 1 cell, when i clicked on 2 cell, in table View

我已经编写了展开和折叠的代码,我的问题是,在 table 视图中,当我点击第一个单元格时,它会正确展开,但是当我点击第二个单元格时,它会自动展开第一个牢房正在崩溃。 我的代码是

-(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];

}

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

这是因为你的 isTagsExapandedisSelectedRowIndex 属性 似乎对整个 class 来说是普通的或单例的,所以如果你 select 任何一行一次然后 if 部分将被执行并且您的 isTagsExapanded 设置为 YES 并且当您的 table 重新加载时它将根据您的数据源和委托方法扩展,现在当您第二次 select 任何单元格然后 isTagsExapanded 设置为 NO 并重新加载 table 设置 table 没有展开行的视图。

因此,无论何时使用点击单元格并且您正在设置 isSelectedRowIndex 并重新加载 table,这意味着 cellforrow 设置单元格仅在 isSelectedRowIndex 处扩展,所有其他单元格设置为由于 if (isTagsExapanded == YES && isSelectedRowIndex == indexPath.row) 这种情况而导致崩溃状态。当 isSelectedRowIndex == indexPath.row 变为真时,只有你的单元格会扩展。

因此,如果您想让扩展的单元格保持扩展状态,那么您应该为扩展的单元格管理 indexPath 数组。在 cellForRowAtIndexPathheightforrow set expanded frame and 160 height 中,对于该数组的每个索引路径(selected 索引路径或 selected 行或扩展单元格的数组)。

你可以获得索引路径数组,例如

   NSArray *arr = [yourTableView indexPathsForSelectedRows];

由于 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;
}

希望对您有所帮助。