从indexPath获取单元格以在单击时展开行?

时间:2014-06-13 05:50:01

标签: ios objective-c uitableview

我知道有一个名为[tableView cellForRowAtIndexPath:indexPath];的方法,我们可以使用它来获取给定indexPath的单元格。但是我想在行敲击时展开行。使用此代码 -

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {   
        // Deselect cell
        [tableView deselectRowAtIndexPath:indexPath animated:TRUE];
        // Toggle 'selected' state
        BOOL isSelected = ![self cellIsSelected:indexPath];

        // Store cell 'selected' state keyed on indexPath
        NSNumber *selectedIndex = [NSNumber numberWithBool:isSelected];
        int sec = indexPath.section;
        int row = indexPath.row;
        NSString* indexpathStr = [NSString stringWithFormat:@"%d-%d", sec, row];

        [selectedIndexes setObject:selectedIndex forKey:indexpathStr];
        // This is where magic happens...
        [tableView beginUpdates];
        [tableView endUpdates];

    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        CGFloat height = 0.0;
        if([self cellIsSelected:indexPath]) {
//problem here
            CalEventCell* cell = (CalEventCell*)[tableView cellForRowAtIndexPath:indexPath]; 
            [self setDescriptionFrame:cell.descriptionLbl];
            height = cell.descriptionLbl.frame.size.height+cell.eventLbl.frame.size.height +20;
        }
        else
            height = 60;
        return height;
    }

当一行点击我在tableview上调用beginUpdatesendUpdates方法并在heightForAtIndexPath方法中更改行高。问题是,你可以看到我从{{1}调用cellForAtIndexPath在cellForRow中有heightForAtIndexPath方法调用,它变成对heightForRow的调用,这个循环永远不会结束,程序会因beginUpdates而崩溃。 那么从indexPath或任何其他方式获取单元格的任何其他方法呢?任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

  • 使用数组存储选定的索引,然后重新加载该tableview。
  • 如果您点击该单元格高度将会扩展,如果您将点击它将会降低其高度。

查看以下代码。

// Add a mutable array to your class
NSMutableArray *selectedCellArray;

// Initialise it in `viewDidLoad`
-(void)viewDidLoad
{
    [super viewDidLoad];
    selectedCellArray = [[NSMutableArray alloc] init];
}


// Add selected indices in selectedCellArray
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Deselect cell
    [tableView deselectRowAtIndexPath:indexPath animated:TRUE];
    [tableView reloadData];

     if (![selectedCellArray containsObject:indexPath]) 
         [selectedCellArray addObject:indexPath];
     else
         [selectedCellArray removeObject:indexPath];

    [tableView beginUpdates]; // Animate the height change
    [tableView endUpdates];
}

// Write the UI Updation in HeightForRowAtIndexPath Method
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat height = 0.0;

    if (selectedCellArray.count>0) {
        if ([selectedCellArray containsObject:indexPath]) {
            CalEventCell* cell = (CalEventCell*)[tableView cellForRowAtIndexPath:indexPath];
            [self setDescriptionFrame:cell.descriptionLbl];
            height = cell.descriptionLbl.frame.size.height+cell.eventLbl.frame.size.height+20;

            return height;
        }else{
            height = 60.f;
            return height;
        }
    }
    return height;  
}

希望这有助于

答案 1 :(得分:2)

您应该在 didSelectRowAtIndexPath 方法上调用以下代码行

[tableView beginUpdates];    
[tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:sec]] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];

当重新加载行时cellForRowAtIndexPath:indexPathheightForRowAtIndexPath方法将被调用,你可以扩展单元格的高度

答案 2 :(得分:0)

如果您使用可重复使用的单元格,则无法在cellForRowAtIndexPath中使用heightForRowAtIndexPath。您需要以其他方式计算高度。可能对您有用的最简单方法是在您的类中保留原型单元格,仅用于调整大小。

答案 3 :(得分:0)

试试这个:

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

     [your_tableView reloadData];
}