ios - 调用 dequeueReusableCellWithIdentifier :cellId inside heightForRowAtIndexPath

标签 ios uitableview

我正在开发一个 ios 应用程序,

我有一个普通的表格 View 。调用 heightForRowAtIndexPath 时,我正在执行以下操作

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellId = [self getCellIds][indexPath.row];
    BaseTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

    return [cell calculateHeigh];
}

基本上我正在使单元格出队,因为我在每个单元格中都有一个函数 calculateHeigh,它会计算高度。这按预期工作正常,但我有一个问题:

heightForRowAtIndexPath 中调用 dequeueReusableCellWithIdentifier: 是否安全?它会引起任何问题吗?

编辑:

为了阐明我这样做的原因,我有大量具有不同标识符的自定义单元格需要加载。为了避免在我的 heightForRowAtIndexPath 中有一个巨大的 if-else 语句,我将单元格高度的 getter 放在自定义单元格中,我只是要求它返回它(那里没有计算),我不能作为类方法来做,因为我不知道是哪个类,我可以从标识符而不是类中获取对象。为了代码的可读性,我想避免使用大的 if-else。

所以我担心的是 dequeueReusableCellWithIdentifier: 在获取高度时调用它是否很重?它会导致内存问题或滞后吗?或者是否值得只做一个 bug if-else 或使用字典?

最佳答案

首先,您应该避免在表格绘制方法中进行任何计算(例如 heightForRow、cellForRow 等)。这些方法被多次调用,尽管您的表格可能很短和/或不复杂(带有带有大量标签、按钮和图像的自定义单元格),但您应该始终尝试优化此绘图过程,否则用户在绘制时会遇到一些令人讨厌的延迟滚动。

所以你应该在调用'reloadTable'之前调用一些方法来准备数据

-(void)prepareMethod
{
    //get only one cell to calculate all row heights
    BaseTableViewCell *cell = [_myTableView dequeueReusableCellWithIdentifier:cellId];

    for (NSDictionary* dataObj in _dataArray)
    {
        //loop through all rows data and set new property for row height
        dataObj[@"rowHeight"] = [cell calculateHeigh];
    }
}

然后在调用 heightForRow 时只需传递这个值,而不需要任何昂贵的操作(例如可能的字符串计算):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //always make sure you don't access unexisting array index
    return ( indexPath.row < _dataArray.count ) ? _dataArray[indexPath.row][indexPath.row][@"rowHeight"] : 1.0;
}

当然,您不需要单独的方法来填充数据数组中的行高 - 您可以在填充(格式化)数据数组时填充此值以避免第二次数组迭代。这完全取决于您当前的实现。

请记住,昂贵的绘图方法(不仅适用于表格)应始终尽可能短,并且只获取绘图所需的数据。真的很简单。如果您需要进行一些复杂的计算,请在此之前进行(可能在 View 初始化中),以便在实际绘图之前准备好数据。这样,即使表格更大,您的应用程序也能顺利运行(因为无论表格有多大,UITableViewController 都只绘制可见单元格)。

问候,

克里斯.托

关于ios - 调用 dequeueReusableCellWithIdentifier :cellId inside heightForRowAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23576489/

相关文章:

ios - 调整 View 的高度以包含 TableView 的行数

ios - 无法弄清楚如何在 Swift 中使用 NSURLSession 将 jsonData 加载到 NSDictionary

iphone - 下拉 UItableView 切换 View Controller

ios - 更新 UITableView 单元格中的 UIImageView 透明度

ios - 单元格中有多个按钮,可将选定的按钮设置为单元格数据

ios - 在 ScrollView 中循环重置(swift 3)

ios - 找出一个函数执行需要多长时间(以秒为单位)

php - 上传图像选择器照片 ios

ios - 将单元格的 subview 快速移动到前面

ios - 在自定义单元格中实现倒计时器