2

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

- (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;
}
4

4 回答 4

3

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

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

于 2012-07-05T05:13:11.840 回答
2

滚动表格时,消失的单元格将被丢弃,出现的单元格必须使用 创建和配置cellForRowAtIndexPath

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

于 2012-07-04T09:01:57.740 回答
1

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

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

于 2012-07-04T09:04:16.100 回答
1

为 UITableView 中的每一行调用该方法cellForRowAtIndexPath,当一行从可见视图中消失时,它的内存被清除并且一个新的单元格进入可见性,因为新的内存被分配(或者旧的可能会重新used) 并且新单元格是使用cellForRowAtIndexPath方法配置的。

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

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

于 2012-07-04T09:04:55.310 回答