Высота пользовательской ячейки после инициализации в UITableView

#objective-c #xcode #uitableview

#objective-c #xcode #uitableview

Вопрос:

У меня есть таблица с пользовательской ячейкой. Эти ячейки имеют разную высоту, и я знаю, как рассчитать высоту. Проблема в том, что метод heightForRowAtIndexPath вызывается перед методом cellForRowAtIndexPath, поэтому я не могу передать CGFloat возврата.

Есть ли способ вызвать этот метод после?

Большое спасибо

Редактировать

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

CustomCellFavorites *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[CustomCellFavorites alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    cell.topSuperiore = self;

}

//textviews

NSString *string01 = ((Traduzioni *)[self.arrayTraduzioni objectAtIndex:indexPath.row]).testoOriginale;
NSString *string02 = ((Traduzioni *)[self.arrayTraduzioni objectAtIndex:indexPath.row]).testoTradotto;

[cell loadItem:string01 :string02];

return cell;
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CustomCellFavorites *cell = (CustomCellFavorites*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
return cell.heightCell;

}
  

метод пользовательской ячейки

 -(void)loadItem:(NSString *)text01:(NSString *)text02 {
textView01.text = text01;
CGRect rect = textView01.frame;
rect.size.height = textView01.contentSize.height;
textView01.frame = rect;
[tv01Bg setFrame:CGRectMake(32, 0, 288, (textView01.contentSize.height) 20)];
textView02.text = text02;

CGRect rect2 = textView02.frame;
rect2.size.height = textView02.contentSize.height;
textView02.frame = rect2;
[tv02Bg setFrame:CGRectMake(0, (textView01.contentSize.height) 20, 320, (textView02.contentSize.height) 20)];
heightCell = (rect2.origin.y) (rect2.size.height) 15.5;
 }
  

Ответ №1:

Нет, нет способа вызвать этот метод после. Способ, которым я справился с этим, заключается в том, чтобы в основном получить фактическую строку и, в зависимости от типа строки, определить высоту. Ниже приводится некоторый краткий код —

 - (CGFloat)tableView:(UITableView *)tableView 
heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSObject *res     = [self.resultSet objectAtIndex:[indexPath row]];

    if([res isKindOfClass:[someX class]])
        return 110;
    else if([res isKindOfClass:[someY class]])
        return 120;
    else if([res isKindOfClass:[someZ class]])
        return 230;
    else
        return 175.0;
}
  

Комментарии:

1. Спасибо, но высота может варьироваться на 100%, и я не могу создать все различные возможности.

2. можете ли вы рассказать что-нибудь еще о типе данных, которые вы обрабатываете? и причина, по которой вам нужно так много изменений в высоте?

3. Конечно, у меня есть два TextView в ячейке, они различаются в зависимости от того, что написал пользователь. Сумма высот и пробелов включена в эту ячейку с плавающей точкой высоты` — (CGFloat)TableView:(UITableView )TableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { Пользовательские ячейки *cell = (Пользовательские ячейки )[self TableView: TableView cellForRowAtIndexPath:indexPath]; возвращает ячейку. Ячейка высоты; } in the custom cell Ячейка высоты = (rect2.origin.y) (rect2.size.height) 15,5;`

4. тогда, если бы вы знали, сколько присутствует TextViews, не могли бы вы тогда вычислить общую высоту? или вы не могли бы использовать cellID , чтобы определить тип ячейки, а затем пользовательский код высоты?

5. поскольку вы используете пользовательские ячейки, вы точно знаете, какой высоты должен быть каждый тип ячейки. итак, если вы извлекаете идентификатор ячейки в heightForRowAtIndexPath , то на основе этого определите высоту.