Я пытаюсь уменьшить дубликат кода при выкладке моего табличного представления, но сталкиваясь с проблемами жизненного цикла. В основном это то, что heightFroRowAtIndexPath вызывается до cellForRowAtIndexPath. Это то, что должно произойти, и я понимаю, почему.heightForRowAtIndexPath, вызываемый до cellForRowAtIndexPath
Но ...
У меня есть элемент, который заложен в раскадровке. Он имеет необязательное поле. Если необязательное поле не находится в данных, я удаляю метку для этого поля. Однако я, что удаление метки в реализации пользовательских ячейки:
CustomCell (расширяет UITableViewCell)
- (void) configureCellForData: (Data *) data {
if (data.optional) {
self.optionalLabel.text = [data.optional];
} else {
[self.optionalLabel removeFromSuperview];
}
}
Тогда в cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:self.tableLayout[indexPath.section][indexPath.row]];
[cell configureCellForData:self.data];
return cell;
}
Который работает отлично подходит для создания ячейки. Однако высота неправильная, если дополнительное поле удалено, то есть мне нужно отрегулировать, если дополнительное поле было удалено.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:self.tableLayout[indexPath.section][indexPath.row]];
CustomCell *headerCell = (CustomCell *) cell;
if (self.data.optional == nil) {
return cell.bounds.size.height - headerCell.optionalLabel.bounds.size.height;
}
return cell.bounds.size.height;
}
}
Это не кажется много, но я упростил мой чек «data.optional == ноль», и это является более сложным, чем это, и включает в себя DB вызов.
Есть ли лучший способ установить это так, что мне не нужно делать проверку дважды один раз, когда вычисляется высота для ячейки и один раз, когда ячейка инициализируется?
Вместо ручного вычисления высоты строки вы можете использовать автоматическую компоновку и позволить содержимому ячейки определять высоту? http://stackoverflow.com/q/18746929/3711928 –
Это выглядит многообещающим, однако, не имея проблем с его внедрением. Мне все равно нужно переопределить heightForRowAtIndexPath, чтобы вернуть 0 в некоторых случаях, когда я не хочу, чтобы ячейка отображалась. Похоже, что когда я переопределяю heightForRowAtIndexPath, мне нужно что-то вернуть, поскольку автоматическая высота не работает. – lostintranslation
Также после прочтения это похоже на то, что это отлично работает для динамического контента внутри четко определенных меток. Не уверен, как правильно это сделать, когда я удаляю ярлыки из представления. – lostintranslation