Подтвердить что ты не робот

Быстрый UITableView set rowHeight

Я пытаюсь установить высоту каждой строки в tableView на высоту соответствующей ячейки с помощью этого кода:

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
      var cell = tableView.cellForRowAtIndexPath(indexPath)
      return cell.frame.height
}

Я получаю эту ошибку при инициализации var cell:

Тема 1: EXC_BAD_ACCESS (код = 2, адрес = 0x306d2c)

4b9b3361

Ответ 1

Для установки высоты строки есть отдельный метод:

Для Swift 3

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100.0;//Choose your custom row height
}

Старые Свифт использует

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 100.0;//Choose your custom row height
}

В противном случае вы можете установить высоту строки, используя:

self.tableView.rowHeight = 44.0

В ViewDidLoad.

Ответ 2

Поставьте значение по умолчанию rowHeight в viewDidLoad или awakeFromNib. Как отметил Мартин Р., вы не можете называть cellForRowAtIndexPath из heightForRowAtIndexPath

self.tableView.rowHeight = 44.0

Ответ 3

yourTableView.rowHeight = UITableViewAutomaticDimension

Попробуйте это.

Ответ 4

Как указано в комментариях, вы не можете вызвать cellForRowAtIndexPath внутри heightForRowAtIndexPath.

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

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

Я взял этот код из проекта, над которым я работаю - к сожалению, в Objective C, я не думаю, что у вас будут проблемы с переводом на быстрый

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    static PostCommentCell *sizingCell = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sizingCell = [self.tblComments dequeueReusableCellWithIdentifier:POST_COMMENT_CELL_IDENTIFIER];
    });

    sizingCell.comment = self.comments[indexPath.row];
    [sizingCell setNeedsLayout];
    [sizingCell layoutIfNeeded];

    CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return size.height;
}

Ответ 5

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            var height:CGFloat = CGFloat()
            if indexPath.row == 1 {
                height = 150
            }
            else {
                height = 50
            }

            return height
        }

Ответ 6

Проблема Причина:
Проблема в том, что ячейка еще не создана. TableView сначала вычисляет высоту строки, а затем заполняет данные для каждой строки, поэтому массив строк не был создан при вызове метода heightForRow. Таким образом, ваше приложение пытается получить доступ к области памяти, на которую оно не имеет разрешения, и поэтому вы получаете сообщение EXC_BAD_ACCESS.

Как добиться самоконтроля TableViewCell в UITableView :
Просто установите правильные ограничения для ваших представлений, содержащихся в представлении TableViewCell в StoryBoard. Помните, что вы не должны устанавливать ограничения по высоте для корневого представления TableViewCell, его высота должна быть правильно рассчитана по высоте его подпредставлений - это похоже на то, что вы делаете для установки надлежащих ограничений для UIScrollView. Таким образом, ваши клетки будут иметь разную высоту в соответствии с их подвидом. Никаких дополнительных действий не требуется

Ответ 7

Убедитесь, что ваш TableView Delegate также работает. если нет, то в вашей раскадровке или в .xib нажмите и удерживайте Control + щелкните правой кнопкой мыши перетаскивание tableView и перетащите его в свой текущий ViewController. Swift 2.0

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 60.0;
}

Ответ 8

Попробуйте код, подобный этому, скопируйте и вставьте в класс

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}