2013-12-12 5 views
0

Насколько я понимаю, основным преимуществом удаления повторно используемых ячеек в UITableViewControllers является сохранение памяти за счет хранения только видимых ячеек и их содержимого в памяти.Правильное использование UITableViewCells с пользовательскими высотами

Тем не менее, это, кажется, имеет смысл создать содержимое ячейки каждый раз, когда клетка запрашиваемую в cellForRowAtIndexPath (соответственно GetCell() в MonoTouch) и освободить всю клетку, когда не используется/видимой больше.

Это работает, если все ячейки имеют одинаковую высоту. Но если только одна ячейка имеет другую динамическую высоту, которая вычисляется путем создания представления содержимого, высота должна быть установлена ​​в пределах heightForRowAtIndexPath (соответственно GetHeightForRow() в MonoTouch).

Теперь я смущен, потому что 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

Я бы предложил предварительное вычисление высот ячеек и сохранение их в массиве. – duci9y

+0

Если бы я сделал это, мне пришлось бы создавать все представления контента перед отображением таблицы, поэтому ожидаемая производительность adavantage исчезнет. –

+0

Не обязательно. Если это текст, вы можете очень легко и эффективно рассчитать размеры. – duci9y

ответ

0

В основном TableViews обычно работают так:

клетки создаются, когда это необходимо, то есть, только количество клеток, показанных на экране создаются. Это связано с тем, что выделение и инициирование объектов дорого. Затем, когда пользователь прокручивает, ячейки отбрасываются из представления таблицы, и новое содержимое добавляется в эту ячейку.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath вызывается для каждой строки в виде таблицы, независимо от того, будут ли ячейки отображаться или нет. (См. Apple doc). Apple также упоминает, что у этого есть некоторые проблемы с производительностью, при этом представления таблиц содержат более 1000 строк.

Лучшее решение, как правило, имеет один идентификатор повторного использования для каждого типа ячеек. Скажем, у вас есть HighCell и LowCell, после чего вы узнаете, какой тип ячейки вам нужен для текущей строки (в cellForRowAtIndexPath) и удалить из этого типа ячейки. Или еще лучше, используйте - (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier (Apple doc)

+0

Прошу прощения, но в вашем ответе нет новостей. В первом абзаце содержится именно то, что я написал, не так ли? –

+0

Вы начали рассказывать о создании просмотров контента раньше. Я попытался объяснить вам, как вы должны создавать представления контента. Это был ваш вопрос, не так ли? – Rick

+0

Нет, речь идет об эффективности с динамическими высотами строк. –

Смежные вопросы