gpt4 book ai didi

ios - 调用 dequeueReusableCellWithIdentifier :cellId inside heightForRowAtIndexPath

转载 作者:行者123 更新时间:2023-11-29 02:58:30 25 4
gpt4 key购买 nike

我正在开发一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com