2014-09-02 4 views
34

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

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)

+1

возможно дубликат [ EXC \ _BAD \ _ACCESS в heightForRowAtIndexPath iOS] (http://stackoverflow.com/questions/12652761/exc-bad-access-in-heightforrowatindexpath-ios) –

+2

Вы не должны вызывать 'cellForRowAtIndexPath' из' heightForRowAtIndexPath'. EXC_BAD_ACCESS вызван переполнением стека, вызванным глубокой рекурсией. –

+0

где мне позвонить CellForRowAtIndexPath? –

ответ

40

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

self.tableView.rowHeight = 44.0 
6

Как было отмечено в комментариях, вы не можете назвать 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; 
} 
+0

Это работает, но при прокрутке выдает множество ошибок ограничения. –

+0

Это не произошло в моем случае, и я использовал автозапуск. – Antonio

+0

@ Антонио Не могли бы вы помочь, как это можно перевести в Свифт? [Здесь] (https://gist.github.com/floydpink/363aac55024f5c1b8650) - это то, что я пробовал, но получал неправильные результаты. –

80

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

Для Свифта 3

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

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

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

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

self.tableView.rowHeight = 44.0 

В ViewDidLoad.

+1

Если вы используете Swift 3.0, вы должны использовать эту функцию: 'func tableView (_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat ' – DoK

+0

Спасибо, отредактировал ответ – Nagarjun

+0

Привет Просто попытался использовать эту функцию, и Xcode 9 beta 6 предложила переопределить, так что правильная подпись переопределяет func tableView (_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat –

6
yourTableView.rowHeight = UITableViewAutomaticDimension 

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

+0

Perfect !! Работал для меня. – Manali

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

      return height 
     } 
0

попробовать подобный код скопировать и вставить в классе

Func Tableview (_ Tableview: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { возвращение 100 }

+0

Как это улучшает ответы? Похож на копию для меня –