Разные высоты 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.

Это единственное решение, которое я думаю.