2013-09-01 3 views
2

У меня есть UITableView, для которого я создал две различные пользовательские ячейки, назовем один «RegularCell» и другой «BigCell». Причина этого в том, что мне нужно другое представление для объектов модели данных, где в определенном случае я хочу представить данные по-разному.iOS >> UITableView с двумя различными пользовательскими UITableViewCells, которые имеют разную высоту

Я немного читал о том, как подойти к нему через heightForRowAtIndexPath против cellForRowAtIndexPath, но я не понимаю, как подойти к нему в моем случае >> В моей таблице я заранее не знаю, какая строка будет включить какую пользовательскую ячейку; Я получаю эти данные только в cellForRowAtIndexPath, где я проверяю массив данных, который я должен представлять для определенной строки.

Кажется глупым делать вычисления в heightForRowAtIndexPath, так как он называется до cellForRowAtIndexPath, и вся идея заключается в том, что вы не создаете все ячейки заранее и просто «занимаете место» для вещей, таких как размер скроллера.

С другой стороны, только когда я понимаю, какой контент я представляю, я могу определить, какую ячейку я требую, и, следовательно, какая должна быть высота строки.

Кто-нибудь сталкивался с подобным случаем и может поделиться некоторой мудростью?

ответ

2

Давид прав!

Я не согласен с вами, говоря

В моей таблице, я не знаю, заранее, что ряд будет включать в которой пользовательские ячейки; Я получаю эти данные только в cellForRowAtIndexPath, где I проверяет массив данных, который я должен представлять для определенной строки .

в heightForRowAtIndexPath вы можете получить доступ к вам DATASOURCE так же, как вы это делаете в cellForRowAtIndexPath:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat bigCellHeight = 80.0; 
    CGFloar regularCellHeight = 44.0; 
    MyDataObject *object = [myArray objectAtIndex: indexPath.row]; 
    if ([object anyConditionToChoseBigCell]) { 
     return bigCellHeight; 
    } 
    return regularCellHeight; 
} 
1

heightForRowAtIndexPath вызывается перед cellForRowAtIndexPath, поскольку планировщик tableView должен знать, насколько большой будет просмотр прокрутки, а также то, какие ячейки должны быть видимыми на экране в момент его отображения, это может варьироваться в зависимости от высота каждой ячейки.

Я столкнулся с этой проблемой раньше, и моя рекомендация заключается в том, что вы вычисляете высоту каждой из ячеек в своей модели до того, как ваш tableView будет запущен даже.

0

У меня была схожая проблема. Это то, что у меня получилось:

-(CGFloat)tableView:(UITableView *)tableView 
heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
return cell.frame.size.height; 
} 
0

ОК ... я нашел простое решение - Так как у меня есть массив объектов данных, я может проверить каждую строку, соответствующее свойство соответствующего объекта данных >> в моем случае у меня есть значение BOOL, называемое isSuper >>, и таким образом я могу установить высоту строки для каждого объекта в БД без необходимости создавать или загружать фактический UITableViewCell в heightForRowAtIndexPath.

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