Разные высоты UITableViewCell?
Я построил три разных ячейки в своей раскадровке и подключил все выходы вверх, каждая ячейка имеет уникальный идентификатор.
Например, у меня есть одна ячейка, которая содержит изображение, другое, у которого есть метка, а другая - с другим содержимым, поэтому они все уникальны, и каждый тип ячейки требует своей собственной высоты (динамический или статус, это не имеет значения).
Однако, как я могу сделать ячейку с "indentifier1" возвратом определенной высоты, а затем остальные ячейки возвращают разные высоты?
Я знаю, что могу использовать - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
, но я не уверен, как различать ячейки.
Я использую основные данные и получаю результаты для таблицы из этого.
Надеюсь, вы сможете помочь, спасибо.
EDIT:
Я пробовал это с тегами, но его сбой в первом выражении if
:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat cellHeight;
if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 1) cellHeight = 170;
else if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 2) cellHeight = 100;
else if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 3) cellHeight = 140;
return cellHeight;
}
Ответы
Ответ 1
конечно, он разбился, потому что вы находитесь в методе делегата (вы являетесь делегатом UITableView
), и из такого метода, возвращающего методы UITableView
, возникает очень высокий риск сбоя.
метод ([tableView cellForRowAtIndexPath:indexPath]
), то, что вы вызываете, вызовет метод делегата снова для высоты ячейки, и это вызовет бесконечный цикл, также известный как авария.
Это нормальное поведение.
ключ находится в исходном источнике данных, вы можете сохранить высоту для каждой строки в исходном источнике данных, и вы можете читать все оттуда в своих делегированных методах без какого-либо риска.
ваш фрагмент кода не говорит, где находится ваш источник данных и какой источник данных, поэтому я не могу дать более точное решение в отсутствие его, но идея в том, что.
Ответ 2
Обновление
Использовать динамическую высоту UITableView сейчас, поскольку это легко, так как UITableView автоматически вычисляет ее
Старый
Используйте этот метод для вашего требования ниже:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
//calculate height according to text and on basis of indexPath
if(indexpath.row == 0)
{
return 60.0f;
}
else if(indexpath.row == 1)
{
return 70.0f;
}
else
{
return 55.0f;
}
}
Примечание: если ваш размер не исправлен, тогда вы будете вычислять его, а затем предоставлять в указанном выше методе в соответствии с вашим требованием.
Ответ 3
Вы бы точно различали их в cellForRowAtIndexPath:
. Если вы не группируете их по разделам, вам нужно будет опросить ваши данные для конкретного рассматриваемого indexPath и определить высоту после этого.
Ответ 4
Я бы установил тег для каждой ячейки UITableView так, чтобы в heightForRowAtIndexPath вы могли различать следующее:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
if ([self.tableview cellForRowAtIndexPath:indexPath].tag == yourTag){
//perform your action for cell 1, 2, or 3
}
else if (etc...)
}
Ответ 5
Вы не должны вызывать cellForRowAtIndexPath
внутри heightForRowAtIndexPath
, или вы введете бесконечный цикл, который приведет к сбою приложения.
Вы должны определить высоту каждой ячейки так же, как вы определяете тип той же ячейки в cellForRowAtIndexPath
.
Это единственное решение, которое я думаю.