2014-09-23 3 views
1

У меня есть UITableViewController с 2 ячейками прототипа с пользовательскими высотами - один имеет высоту 187 точек, а другой имеет высоту 140 точек. Высота строки по умолчанию В Tableview является ГЭЭ 187.XCode 6 issue - dequeueReusableCellWithIdentifier не возвращает пользовательскую высоту ячейки

Мой cellForRowAtIndexPath выглядит следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0) { 
     MyListingCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyListingCell"]; 
     [cell initWithListing:[self.listings objectAtIndex:indexPath.row]]; 
     return cell; 
    } else { 
     return [tableView dequeueReusableCellWithIdentifier:@"AddMyListingCell"]; 
    } 
} 

и у меня есть соответствующий heightForRowAtIndexPath который выглядит следующим образом:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0) { 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyListingCell"]; 
     return cell.frame.size.height; 
    } else { 

     //if no listings exist, make the cell full-screen height 
     if (self.listings.count == 0) { 
      return tableView.frame.size.height; 
     } else { 
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AddMyListingCell"]; 
      return cell.frame.size.height; 
     } 
    } 
} 

Когда я запускаю код , высота ячеек получается правильно. 187 и 140 соответственно.

Однако, я хотел бы изменить размер ячейки более 213 точек. Для этого я меняю пользовательскую высоту таблицы на 213. Проблема в том, что когда я запускаю код (используя XCode 6), ячейки таблицы по-прежнему выходят как высота 187.

Я попытался изменить свойство tableview rowheight по умолчанию, также до 213. Однако я все еще получаю 187. На самом деле, когда я смотрю на раскадровку (как текст), нигде не упоминается нигде. Но похоже, что XCode запоминает предыдущее значение.

Я пробовал очистить, глубоко очистить, перезагрузить xcode, удалить приложение с моего телефона и удалить мои продукты отладки. Я не могу забыть его 187.

Может ли это быть ошибкой в ​​XCode 6? В XCode 5 этого не бывает (доказано). Пользовательские высоты ящиков отлично работают в XCode 5, но эта проблема возникла на следующий день после установки XCode 6.

Может ли кто-нибудь помочь с советами по вещам, чтобы попытаться или подтвердить, что я не схожу с ума.

+0

Это выглядит как проблема, связанная с тем, как сделаны ячейки и их высоты, а не Xcode. Если я правильно помню, heightForRowAtIndexPath вызывается до того, как ячейка создана, а не после. – Mike

+0

@ theDuncs - Любопытно, если вам посчастливилось решить эту проблему? Я считаю, что столкнулся с одним и тем же - я пытаюсь использовать две ячейки прототипа в UITableView, каждый с другой высотой строки.Сначала я просмотрел метод heightForRowAtIndexPath: но не имел никакого успеха в использовании этого с iOS8. Вам удалось найти способ выполнить это, используя высоту строки таблицы раскадровки стола? Благодаря! –

+0

@DerekLee Я подал радар с Apple, и они сказали, что это была проблема, о которой уже сообщалось. Я еще не нашел другого обходного пути, кроме как скопировать UITableViewCell из раскадровки pre XCode6, вставить его и изменить три параметра размера в XML-файле раскадровки. Дайте мне знать, если вы хотите, чтобы я опубликовал это как возможное обходное решение. – theDuncs

ответ

1

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"CELL"); 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 

    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"HEIGHT"); 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    NSLog(@"%@", cell); 
    return cell.frame.size.height; 
} 

Это приводит к:

2014-09-23 09:55:05.114 NewTesting[54040:60b] HEIGHT 
2014-09-23 09:55:05.114 NewTesting[54040:60b] (null) 
2014-09-23 09:55:05.115 NewTesting[54040:60b] HEIGHT 
2014-09-23 09:55:05.115 NewTesting[54040:60b] (null) 
2014-09-23 09:55:05.115 NewTesting[54040:60b] HEIGHT 
2014-09-23 09:55:05.116 NewTesting[54040:60b] (null) 
2014-09-23 09:55:05.116 NewTesting[54040:60b] HEIGHT 
2014-09-23 09:55:05.116 NewTesting[54040:60b] (null) 
2014-09-23 09:55:05.117 NewTesting[54040:60b] CELL 
2014-09-23 09:55:05.118 NewTesting[54040:60b] CELL 
2014-09-23 09:55:05.119 NewTesting[54040:60b] CELL 
2014-09-23 09:55:05.120 NewTesting[54040:60b] CELL 

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

Вы пробовали что-то более простое, как в следующем (хотя я бы лично использовать константы)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return indexPath.section == 0 ? 213 : 140; 
} 

Это приобретает все ячейки в первом разделе, 213 в высоту и любой другой участок 140 высотой, которая может быть неверным.

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

+0

Я использую heightForRowAtIndexPath в течение нескольких месяцев без проблем. Он правильно вытягивает пользовательскую высоту ячейки, где ячейка определена в раскадровке. В вашем примере я предполагаю, что вы не добавили UITableViewCell на свою доску с идентификатором повторного использования «cell». Если вы это сделаете, он должен вернуть правильные значения. – theDuncs

+0

Это правильно, я не использую (и вообще не использую) раскадровки. Но, как я сказал в своем ответе, почему бы просто не вернуть высоту, которую вы знаете, они будут основываться на источнике данных и разделе? Таким образом, вам даже не нужно возиться с попытками деактивировать ячейки (потенциально) до их существования. Я был бы очень удивлен, если использование раскадровки изменит порядок операций. – Mike

+0

Потому что я не хочу жестко задавать высоту ячеек в коде. Я хочу, чтобы иметь возможность изменять высоту ячеек в раскадровке, и чтобы изменения отражались в приложении. Это функциональность, которая отлично работает в XCode 5 за последний год. – theDuncs

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