首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在heightForRowAtIndexPath中调用dequeueReusableCellWithIdentifier:cellId

在heightForRowAtIndexPath中调用dequeueReusableCellWithIdentifier:cellId
EN

Stack Overflow用户
提问于 2014-05-10 02:28:14
回答 3查看 1.5K关注 0票数 0

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

我有一个普通的桌子视图。当我打电话给heightForRowAtIndexPath时,我正在做折叠式

代码语言:javascript
复制
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellId = [self getCellIds][indexPath.row];
    BaseTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

    return [cell calculateHeigh];
}

基本上,我是去排队的细胞,因为我有一个函数,calculateHeigh在每个单元内,将进行高度计算。这是正常运作,但我有一个关切:

dequeueReusableCellWithIdentifier:中调用heightForRowAtIndexPath安全吗?会引起什么问题吗?

编辑:

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

所以我关心的是dequeueReusableCellWithIdentifier:,当它达到这个高度时,它是否很重?它会导致内存问题或延迟吗?或者,如果不使用字典的话,只做一个bug值得吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-10 17:19:52

我不喜欢在heightForRowAtIndexPath中使用大的if语句并使用dequeueReusableCellWithIdentifier访问单元格。你从每个细胞中获取细胞高度的方法是合理的。我相信您的calculateHeigh返回值取决于传递给单元格的表数据。

在BaseTableViewCell.h中

代码语言:javascript
复制
+ (CGFloat)heightWithData:(id)data;

在BaseTableViewCell.m中

代码语言:javascript
复制
+ (CGFloat)heightWithData:(id)data
{
    //put your calculateHeigh logic here. I believe your calculateHeigh depends on the data each cell has.
}

那你就可以

代码语言:javascript
复制
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [BaseTableViewCell heightWithData:[self.tableData objectAtIndex:indexPath.row]];
}

如果这样做,则不需要访问每个单元格对象以获得单元格高度。

票数 0
EN

Stack Overflow用户

发布于 2014-05-10 04:50:08

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

因此,在调用'reloadTable‘之前,您应该调用一些方法来准备数据

代码语言:javascript
复制
-(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时,只需传递这个值,而不需要任何昂贵的操作(例如,可能是字符串计算):

代码语言:javascript
复制
- (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;
}

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

请记住,昂贵的绘图方法(不仅仅是表格)应该尽可能短,只需获取绘图和绘图所需的数据。真的很简单。如果您需要进行一些复杂的计算,在此之前(可能在视图中),那么您的数据在实际绘图之前就已经准备好了。这样,即使使用更大的表,应用程序也能顺利工作(因为无论表有多大,UITableViewController只绘制可见的单元格)。

致以敬意,

hris.to

票数 1
EN

Stack Overflow用户

发布于 2014-05-10 02:38:57

不应使用此方法提供计算。根据我在您的设置中可以看到的内容,您正在根据单元格上已经存在的值计算高度。所发生的情况是,单元格排队列系统将给您一个单元可以重用,但由于它共享来自多个索引路径的单元格,该单元格可能拥有与当前的索引路径不同的索引路径记录中的数据。获取计算高度代码,并尝试在您正在使用的数据源回调中复制它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23576489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档