UITableView issue (iOS)



我想知道为什么在滚动UITableView时调用cellForRowAtIndexPath函数。这是否意味着在每个滚动单元格配置代码上都会再次运行?滚动表格时遇到缓慢问题。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CountryCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell...
NSString *continent = [self tableView:tableView titleForHeaderInSection:indexPath.section];
NSString *country = [[self.countries valueForKey:continent] objectAtIndex:indexPath.row];
cell.textLabel.text = country;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}

正如其他人所说,是的,当每个新单元格即将滚动到屏幕上时,会为每个单元格调用cellForRowAtIndexPath。虽然这可能会让你觉得性能受到影响,但另一种选择(让iOS预先创建所有单元格)会更糟:如果你发现创建一个单元格很慢,想象一下必须创建数百个单元格,其中许多用户可能永远不会看到。无论如何,cellForRowAtIndexPath的即时性可能更有效,无论是在前期性能方面,还是在小型移动设备上宝贵的内存消耗方面。

就性能缓慢而言,这里没有什么可能是罪魁祸首。我们很多人都有cellForRowAtIndexPath方法,这些方法要复杂得多,速度不是问题。也许有更有效的替代方案来代替valueForKey查找,如果您进行数百万次查找,我可能会建议您这样做,但对于一个单元格,人眼将无法观察到差异。我认为你必须看看别处。titleForHeaderInSection是否在做任何奇怪的事情(即只是在数组中查找值的其他事情)?也许你可以和我们分享一下。也许 UI 中的某些内容。也许你应该通过探查器的"时间探查器"运行它,也许有些东西会突出。但是这么简单的cellForRowAtIndexPath应该会带来完美流畅的用户体验。

滚动表格时,将丢弃消失的单元格,并且必须使用 cellForRowAtIndexPath 创建和配置显示的单元格。

或者更好说 - 单元格不会被丢弃,它们被移动到可以重用的单元格队列中,并且不会创建新单元格 - 可重用单元格从队列中取出并重新配置。

一行从可见视图中消失时,将清除其内存并显示一个新单元格,为UITableView中的每一行调用该方法cellForRowAtIndexPath,因为将分配新内存(或可能重新使用旧内存),并使用cellForRowAtIndexPath方法配置新单元格。

从这种方法中只能知道需要为此特定单元配置什么。

它很慢可能是因为对于每个单元格,您正在执行一些繁重的操作。

滚动表时调用cellForRowAtIndexPath是正确的,这正是它的用途。每次滚动过程中出现新单元格时,都应创建或重用 UITableViewCell 实例,然后进行配置。

速度缓慢通常是由于在配置阶段执行昂贵的操作引起的。在您的情况下,潜在的缓慢操作将是国家/地区查找。

最新更新