如何检查是否重新选择了选定的单元格

时间:2015-02-06 03:14:06

标签: ios objective-c uitableview custom-cell heightforrowatindexpath

我有一个自定义UITableViewCell,我在选择上进行了扩展。如果重新选择了所选的单元格,我想要做的是让单元格高度恢复正常(44)。这是我的代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([indexPath isEqual:self.selectedCell] && ![[tableView indexPathForSelectedRow] isEqual:indexPath]) {
        return 100;
    }
    return 44;
}

代码工作正常,但似乎忽略了if语句中的第二个术语。显然,我做错了。有办法解决吗?

4 个答案:

答案 0 :(得分:3)

我不知道为什么要将单元格与indexPath进行比较。

[indexPath isEqual:self.selectedCell]

如果您只想扩展所选单元格。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([[tableView indexPathForSelectedRow] isEqual:indexPath]) 
    {
        return 100;
    }
    return 44;
}

UITableViewDelegate取消选择方法

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

您需要在此委托中重新加载单元格

[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

答案 1 :(得分:1)

您需要将该特定索引路径存储在数组中以指示它已展开让我们说您已选择5行将该行存储在数组中,并在选择后重新加载该行

以下是可以帮助您实现此目标的小代码段

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

if([_arrExpandedRows containsObject:indexPath.row]){
     [_arrExpandedRows removeObject:indexPath.row];
    }else{
     // [_arrExpandedRows removeAllObjects]; // IF you only want to make it work for single row
      [_arrExpandedRows addObject:indexPath.row];
    }
[tableView reloadData];
}

heightForRowAtIndexPath

   - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([_arrExpandedRows containsObject:indexPath.row]){ 
    {
        return 100;
    }
    return 44;
} 

那么,如果你的数组包含扩展行的对象,它将会减少行高并返回到44,如果不是,它会使它回到100。

以上代码也适用于多行以同时展开和折叠。

答案 2 :(得分:0)

您可以这样做:

@interface ViewController () <UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, strong) UITableView* tableView;
@property (nonatomic, strong) NSMutableArray* selectedIndexPaths;

@end
<...>
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:CELL_ID];
    cell.textLabel.text = [NSString stringWithFormat:@"%i", (int)indexPath.row];

    return cell;
}


#pragma mark UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   CGFloat height = 44.0;
   if ([_selectedIndexPaths containsObject:indexPath])
   {
       height = 100;
    }

   return height;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{//store or remove selected indexPaths
    if ([_selectedIndexPaths containsObject:indexPath])
    {
        [_selectedIndexPaths removeObject:indexPath];
    }
   else
   {
        [_selectedIndexPaths addObject:indexPath];
    }

    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

答案 3 :(得分:0)

我认为你想要的是在点击选定的单元格时取消选择单元格。

存储选定的IndexPath并在委托中进行比较

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

    if ([selectedIndexPath isEqual:indexPath])
    {
         [tableView deselectRowAtIndexPath:indexPath animated:1];
    }
    else
    {
        selectedIndexPath = indexPath;
    }          
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}