正确地重用UITableViewCells和自定义高度

时间:2013-12-12 12:27:16

标签: ios objective-c uitableview xamarin.ios

根据我的理解,在UITableViewControllers中出现可重用单元格的主要好处是通过仅将当前可见单元格及其内容保存在内存中来节省内存。

也就是说,每次在 cellForRowAtIndexPath (MonoTouch中分别为GetCell())中请求单元格时创建单元格的内容似乎是有意义的,并且在不使用时释放整个单元格/可见。

如果所有单元格具有相同的高度,那么该方法有效。但是,如果只有一个单元格具有另一个动态高度(通过创建内容视图计算),则必须在 heightForRowAtIndexPath (MonoTouch中分别为GetHeightForRow())中设置高度。

现在我很困惑,因为 heightForRowAtIndexPath似乎在表格中为所有单元格调用,甚至是当前不在视口中的单元格。

请参阅以下日志(第一个数字是节索引,第二个是行索引):

2013-12-12 13:00:29.322 MyApp[32603:80b] GetHeightForRow - 1 - 0
2013-12-12 13:00:29.323 MyApp[32603:80b] GetHeightForRow - 1 - 1
2013-12-12 13:00:29.323 MyApp[32603:80b] GetHeightForRow - 1 - 2
2013-12-12 13:00:29.323 MyApp[32603:80b] GetHeightForRow - 1 - 3
2013-12-12 13:00:29.324 MyApp[32603:80b] GetHeightForRow - 1 - 4
2013-12-12 13:00:29.324 MyApp[32603:80b] GetHeightForRow - 1 - 5
2013-12-12 13:00:29.325 MyApp[32603:80b] GetHeightForRow - 1 - 6
2013-12-12 13:00:29.325 MyApp[32603:80b] GetHeightForRow - 1 - 7
2013-12-12 13:00:29.326 MyApp[32603:80b] GetHeightForRow - 1 - 8
2013-12-12 13:00:29.326 MyApp[32603:80b] GetHeightForRow - 1 - 9
2013-12-12 13:00:29.326 MyApp[32603:80b] GetHeightForRow - 1 - 10
2013-12-12 13:00:29.327 MyApp[32603:80b] GetHeightForRow - 1 - 11
2013-12-12 13:00:29.327 MyApp[32603:80b] GetHeightForRow - 1 - 12
2013-12-12 13:00:29.328 MyApp[32603:80b] GetHeightForRow - 1 - 13
2013-12-12 13:00:29.328 MyApp[32603:80b] GetHeightForRow - 1 - 14
2013-12-12 13:00:29.329 MyApp[32603:80b] GetHeightForRow - 1 - 15
2013-12-12 13:00:29.329 MyApp[32603:80b] GetHeightForRow - 1 - 16
2013-12-12 13:00:29.330 MyApp[32603:80b] GetHeightForRow - 1 - 17
2013-12-12 13:00:29.330 MyApp[32603:80b] GetHeightForRow - 1 - 18
2013-12-12 13:00:29.330 MyApp[32603:80b] GetHeightForRow - 1 - 19
2013-12-12 13:00:29.331 MyApp[32603:80b] GetHeightForRow - 1 - 20
2013-12-12 13:00:29.331 MyApp[32603:80b] GetHeightForRow - 1 - 21
2013-12-12 13:00:29.331 MyApp[32603:80b] GetHeightForRow - 1 - 22
2013-12-12 13:00:29.332 MyApp[32603:80b] GetHeightForRow - 1 - 23
2013-12-12 13:00:29.332 MyApp[32603:80b] GetHeightForRow - 1 - 24
2013-12-12 13:00:29.332 MyApp[32603:80b] GetHeightForRow - 0 - 0
2013-12-12 13:00:29.333 MyApp[32603:80b] GetHeightForRow - 0 - 1
2013-12-12 13:00:29.335 MyApp[32603:80b] GetCell - 0 - 0
2013-12-12 13:00:29.344 MyApp[32603:80b] GetCell - 0 - 1
2013-12-12 13:00:29.347 MyApp[32603:80b] GetCell - 1 - 0
2013-12-12 13:00:29.349 MyApp[32603:80b] GetCell - 1 - 1
2013-12-12 13:00:29.351 MyApp[32603:80b] GetCell - 1 - 2
2013-12-12 13:00:29.354 MyApp[32603:80b] GetCell - 1 - 3
2013-12-12 13:00:29.356 MyApp[32603:80b] GetCell - 1 - 4
2013-12-12 13:00:29.358 MyApp[32603:80b] GetCell - 1 - 5
2013-12-12 13:00:29.361 MyApp[32603:80b] GetCell - 1 - 6
2013-12-12 13:00:29.363 MyApp[32603:80b] GetCell - 1 - 7

有没有办法在渲染表之前不创建所有内容视图,这是我还没看到的东西?或者我的基本假设是错误的,这是关于性能的最佳方式,以前不创建所有内容视图?

由于

1 个答案:

答案 0 :(得分:0)

基本上TableViews的工作方式通常如下:

在需要时创建单元格,即仅创建屏幕上显示的单元格数。这是因为分配和启动对象很昂贵。然后,当用户滚动时,单元格从表格视图中退出,新内容将添加到该单元格中。

无论是否显示单元格,都会为表视图中的每一行调用

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath。 (见Apple doc)。 Apple还提到,对于包含超过1000行的表视图,这会遇到一些性能问题。

最佳解决方案通常是为每种类型的单元格提供一个重用标识符。假设您有HighCellLowCell,那么您将找出当前行所需的单元格类型(在cellForRowAtIndexPath中)并将该类型的单元格出列。或者甚至更好,使用- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifierApple doc