我正在开发一个ios应用程序,
我有一个普通的桌子视图。当我打电话给heightForRowAtIndexPath时,我正在做折叠式
- (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值得吗?
发布于 2014-05-10 17:19:52
我不喜欢在heightForRowAtIndexPath中使用大的if语句并使用dequeueReusableCellWithIdentifier访问单元格。你从每个细胞中获取细胞高度的方法是合理的。我相信您的calculateHeigh返回值取决于传递给单元格的表数据。
在BaseTableViewCell.h中
+ (CGFloat)heightWithData:(id)data;在BaseTableViewCell.m中
+ (CGFloat)heightWithData:(id)data
{
//put your calculateHeigh logic here. I believe your calculateHeigh depends on the data each cell has.
}那你就可以
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [BaseTableViewCell heightWithData:[self.tableData objectAtIndex:indexPath.row]];
}如果这样做,则不需要访问每个单元格对象以获得单元格高度。
发布于 2014-05-10 04:50:08
首先,您应该避免在表格绘制方法(如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;
}当然,您不需要单独的方法来填充数据数组中的行高--您可以在填充(格式化)数据数组时填充此值,以避免第二次数组迭代。这完全取决于您当前的实现。
请记住,昂贵的绘图方法(不仅仅是表格)应该尽可能短,只需获取绘图和绘图所需的数据。真的很简单。如果您需要进行一些复杂的计算,在此之前(可能在视图中),那么您的数据在实际绘图之前就已经准备好了。这样,即使使用更大的表,应用程序也能顺利工作(因为无论表有多大,UITableViewController只绘制可见的单元格)。
致以敬意,
hris.to
发布于 2014-05-10 02:38:57
不应使用此方法提供计算。根据我在您的设置中可以看到的内容,您正在根据单元格上已经存在的值计算高度。所发生的情况是,单元格排队列系统将给您一个单元可以重用,但由于它共享来自多个索引路径的单元格,该单元格可能拥有与当前的索引路径不同的索引路径记录中的数据。获取计算高度代码,并尝试在您正在使用的数据源回调中复制它。
https://stackoverflow.com/questions/23576489
复制相似问题