Быстрый 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)
Ответы
Ответ 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
}