2011-12-19 3 views
1

У меня есть следующая настройка: UITableView с пользовательской реализацией UITableViewCell. В каждой ячейке у меня есть UILabel и UIButton. Когда таблица сначала отображается, в каждой из ячеек UILabel имеет количество строк, установленных в 1, и все ячейки имеют фиксированную высоту (60 пикселей в моем случае). Когда нажата кнопка в ячейке, количество строк в строке UILabel устанавливается равным 0, а перенос слов включается, эффективно расширяя ячейку таблицы.UITableView - динамическая высота ячейки, контролируемая самой ячейкой

Теперь проблема заключается в том, что только реализация UITableViewCell знает, расширена ли метка или нет, и, следовательно, какая должна быть высота ячейки. Однако файл владельца является источником данных таблицы.

Я не могу получить может возглавить, как это установить. Любые идеи приветствуются.

Update здесь выдержки из моего кода

В пользовательской реализации UITableViewCell:

- (float)requiredHeight 
{ 
    if(isFull) 
    { 
     CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font] 
            constrainedToSize: CGSizeMake(300.0f, 300.0f) 
             lineBreakMode: UILineBreakModeTailTruncation]; 
     return 42.0f + labelSize.height; 
    } 
    else 
    { 
     return 60.0f; 
    } 
} 

В владельца файла (UITableViewDelegate):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    OOCommentCell *cell = (OOCommentCell*)[tableView cellForRowAtIndexPath:indexPath]; 
    return [cell requiredHeight]; 
} 

Однако это приводит к статистически в бесконечный цикл или BAD_ACCESS_EXCEPTION.

ответ

2

OK, после того, как какой-то изо всех сил, вот что я закончил с, какой вид работ.

  1. Я создал простой класс содержит информацию, относящуюся к одной ячейке:
@interface CommentInfo : NSObject 
{ 
    int ID; 
    NSString *Name; 
    NSString *Date; 
    NSString *Content; 
    BOOL IsFull; 
    float Height; 
} 

@property (readonly) int ID; 
@property (readonly) NSString *Name; 
@property (readonly) NSString *Date; 
@property (readonly) NSString *Content; 
@property (readwrite, assign) float Height; 
@property (readwrite, assign) BOOL IsFull; 

- (id)initWithID:(int)_id withName:(NSString *)_name withDate:(NSString *)_date withText:(NSString *)_text; 

@end 

Не беспокойтесь слишком много о всех свойствах - наиболее важным из них является Height ,

  1. В моем контроллере (который также является делегатом для представления таблицы), я храню данные в виде NSMutableArray указателей на объекты типа CommentInfo.

  2. В cellForRowAtIndexPath Я получаю соответствующий указатель и передаю его в пользовательскую реализацию ячейки во время построения, где он хранится. Я также установил self в качестве делегата в ячейку.

  3. В реализации пользовательской ячейки, когда мне нужно развернуть/изменить высоту, я обновляю свойство Height в объекте CommentInfo и вызываю метод в делегате для обновления дисплея.

  4. Когда updateDisplay вызывается метод, я просто сделать следующее:

[CommentsTable beginUpdates]; 
[CommentsTable endUpdates]; 
  1. В heightForRowAtIndexPath методе я получить соответствующий указатель на CommentInfo и читать Height недвижимость , Поскольку указатель совпадает с указателем между контроллером и ячейкой, любые изменения этого свойства будут видны в обоих классах.

Работа выполнена.

+0

Я использую UIWebView внутри UITableViewCell, поэтому он не может определить высоту при вызове heightForRowAtIndexPath. Что я делаю, я установил ячейку в качестве делегата для UIWebView и в методе webViewDidFinishLoad, который я называю [webView sizeToFit]; webView.hidden = НЕТ; [tableViewController setRowHeight: webView.bounds.size.height forRowId: id]; и в методе setRowHeight UITableViewController я вызываю эти два метода, которые вы указали: [tableView beginUpdates]; [tableView endUpdates]; и это работает. – asdfasdfads

0

Внесите метод UITableViewDelegate – tableView:heightForRowAtIndexPath: в ваш делегат таблицы. Если вы хотите определить высоту для каждой ячейки, вы можете «переслать» этот вызов в класс ячейки, вызвав свой собственный метод tableView: cellForRowAtIndexPath: в таблицеView: heightForRowAtIndexPath.

Обновление: Выполнено в коде. Ошибка была вызвана неправильной сигнатурой метода в делегате, вызывающем tableView: cellForRowAtIndexPath.

В пользовательской реализации UITableViewCell:

- (CGFloat)requiredHeight 
{ 
    if(isFull) 
    { 
     CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font] 
            constrainedToSize: CGSizeMake(300.0f, 300.0f) 
             lineBreakMode: UILineBreakModeTailTruncation]; 
     return 42.0f + labelSize.height; 
    } 
    else 
    { 
     return 60.0f; 
    } 
} 

В владельца файла (UITableViewDelegate):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    OOCommentCell *cell = (OOCommentCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    return [cell requiredHeight]; 
} 
+0

Я не думаю, что я следую вашей логике. Я определил 'heightForRowAtIndexPath', в нем я попытался получить ячейку по пути index, а затем вызвать метод в ней, чтобы вернуть нужный путь, однако это приводит к ошибке bad_access_exception. –

+0

По существу, таблица запрашивает UITableViewDelegate: «Как высока должна быть строка X?» через метод tableView: heightForRowAtIndexPath :. Вы должны вернуть CGFloat нужной высоты в пикселях, а не путь индекса. –

+0

@JacobJinnings: вы, кажется, неправильно читаете мой код. Чтобы «насколько высок должен быть столбец X», я пытаюсь получить эту строку X и спросить ее, насколько высока она должна быть - и вернуть это значение. Пожалуйста, взгляните на код более внимательно. –

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