【问题标题】:Automatically Collapsing the 1 cell, when i clicked on 2 cell, in table View当我在表格视图中单击 2 个单元格时,自动折叠 1 个单元格
【发布时间】:2017-03-02 00:26:54
【问题描述】:

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

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

}

【问题讨论】:

  • 请正确解释这里的问题是什么,您是否需要第一个单元格在第二个选择时折叠
  • 当我点击第一个单元格时,它正在完美展开,但是当我点击第二个单元格时,第一个单元格会自动折叠,但我希望第一个单元格也被展开,直到我点击第一个单元格,不应该折叠

标签: ios uitableview ipad tableviewcell


【解决方案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;
}

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    确认该属性是单个单元格属性还是整个表格属性。

    【讨论】:

    • isTagsExapanded
    • 行和节
    【解决方案3】:

    这是因为您的 isTagsExapandedisSelectedRowIndex 属性对于整个班级来说似乎是常见的或单例的,所以如果您选择任何行一次,那么 if 部分将被执行并且您的 isTagsExapanded 设置为 YES 以及何时当您第二次选择任何单元格然后 isTagsExapanded 设置为 NO 并重新加载表集 tableview 没有扩展行时,您的表重新加载它将根据您的数据源和委托方法进行扩展。

    因此,每当使用点击单元格并且您正在设置 isSelectedRowIndex 并重新加载表时,这意味着 cellforrow 设置单元格仅在 isSelectedRowIndex 处展开,并且由于 if (isTagsExapanded == YES && isSelectedRowIndex == indexPath.row) 这种情况,所有其他单元格都设置为折叠状态。当isSelectedRowIndex == indexPath.row 变为真时,那时只有你的单元格会扩展。

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

    你可以得到类似的 indexpath 数组,

       NSArray *arr = [yourTableView indexPathsForSelectedRows];
    

    【讨论】:

      猜你喜欢
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      相关资源
      最近更新 更多