2015-10-05 3 views
0

Я пытаюсь уменьшить дубликат кода при выкладке моего табличного представления, но сталкиваясь с проблемами жизненного цикла. В основном это то, что 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 вызов.

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

+0

Вместо ручного вычисления высоты строки вы можете использовать автоматическую компоновку и позволить содержимому ячейки определять высоту? http://stackoverflow.com/q/18746929/3711928 –

+0

Это выглядит многообещающим, однако, не имея проблем с его внедрением. Мне все равно нужно переопределить heightForRowAtIndexPath, чтобы вернуть 0 в некоторых случаях, когда я не хочу, чтобы ячейка отображалась. Похоже, что когда я переопределяю heightForRowAtIndexPath, мне нужно что-то вернуть, поскольку автоматическая высота не работает. – lostintranslation

+0

Также после прочтения это похоже на то, что это отлично работает для динамического контента внутри четко определенных меток. Не уверен, как правильно это сделать, когда я удаляю ярлыки из представления. – lostintranslation

ответ

0

Если вы хотите только проверить, как можно сохранить массив логических значений, который хранит, есть или нет данные. Итак, сделайте проверку для каждой строки, сохраните результат в массиве, прежде чем выполнять проверку в следующий раз, проверьте, имеет ли массив значение для этой ячейки, если это так, используйте это значение, если нет, сделайте вызов базы данных.

Убедитесь, что вы сохраняете значения только в индексе массива, связанного с indexPath, и если массив короче, чем указатель indexPath, вы знаете, что вам нужно сделать вызов и добавить значение в массив.

Редактировать: Поскольку я думаю об этом больше, я бы поставил значение bool на самой ячейке, а затем просто позвонил cell.isDataAvailable (или что бы вы ни хотели, чтобы это было), чтобы избежать второго вызова, когда вы идете в установите ячейку вверх, как вы уже проверили бы это в heightForRowAtIndexPath.

Смежные вопросы