2015-11-19 2 views
2

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

enter image description here

Я проверил cellforrowatindexpath и это, кажется, как правило, называется для всех UITableViewCells. Есть ли у вас какие-либо идеи о том, с чего начать отладку?

Здесь моя конфигурация Раскадровка:

enter image description here

Вот немного часть кода, который я написал для отладки вопрос, однако только первый NSLog получает распечатанный и все это, кажется, все в порядке :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
CoreDataTVCell *cell = (CoreDataTVCell *)[tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath]; 
NSLog(@"Cell row: %ld section: %ld", (long)indexPath.row, (long)indexPath.section); 

@try { 
    cell.managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    [cell updateCell]; 
} 
@catch (NSException *exception) { 
    NSLog(@"Object not found: %@", exception.callStackSymbols); 
} 

if(!cell) 
{ 
    NSLog(@"Cell not found"); 
} 

return cell; 
} 

Та же проблема происходит и с ТВЦ проще с 2-идентификаторов клеток (по одному для заголовка и один для других строк):

enter image description here

Вот это то, что я получаю, печатая видимые ячейки (кроме первого):

enter image description here

2015-11-19 17:34:28.430 XXX[7483:3224955] ADA APENNINE - <CustomerTVCell: 0x15601e000; baseClass = UITableViewCell; frame = (0 240; 768 120); clipsToBounds = YES; hidden = YES; autoresize = W; layer = <CALayer: 0x1557bdf50>> 
2015-11-19 17:34:28.431 XXX[7483:3224955] ADA APENNINE - <CustomerTVCell: 0x15601e000; baseClass = UITableViewCell; frame = (0 240; 768 120); clipsToBounds = YES; hidden = YES; autoresize = W; layer = <CALayer: 0x1557bdf50>> 
2015-11-19 17:34:28.431 XXX[7483:3224955] AMED - <CustomerTVCell: 0x156036a00; baseClass = UITableViewCell; frame = (0 480; 768 120); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x1557b68e0>> 
2015-11-19 17:34:28.432 XXX[7483:3224955] AMED - <CustomerTVCell: 0x156036a00; baseClass = UITableViewCell; frame = (0 480; 768 120); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x1557b68e0>> 
2015-11-19 17:34:28.432 XXX[7483:3224955] AMPARO - <CustomerTVCell: 0x1560dc400; baseClass = UITableViewCell; frame = (0 720; 768 120); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x1556e7980>> 
2015-11-19 17:34:28.433 XXX[7483:3224955] AMPARO - <CustomerTVCell: 0x1560dc400; baseClass = UITableViewCell; frame = (0 720; 768 120); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x1556e7980>> 
2015-11-19 17:34:28.433 XXX[7483:3224955] ADA APENNINE - <CustomerTVCell: 0x15601e000; baseClass = UITableViewCell; frame = (0 240; 768 120); clipsToBounds = YES; hidden = YES; autoresize = W; layer = <CALayer: 0x1557bdf50>> 

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

Вот это то, что должно быть отображено:

2015-11-19 17:45:50.314 X[7483:3224955] Cell row: 0 section: 0 
2015-11-19 17:45:50.318 X[7483:3224955] Customer: A LA MODE 

2015-11-19 17:45:50.321 X[7483:3224955] Cell row: 1 section: 0 
2015-11-19 17:45:50.322 X[7483:3224955] Customer: ADA APENNINE 

2015-11-19 17:45:50.325 X[7483:3224955] Cell row: 2 section: 0 
2015-11-19 17:45:50.326 X[7483:3224955] Customer: ALTON 

2015-11-19 17:45:50.329 X[7483:3224955] Cell row: 3 section: 0 
2015-11-19 17:45:50.330 X[7483:3224955] Customer: AMED 

2015-11-19 17:45:50.337 X[7483:3224955] Cell row: 4 section: 0 
2015-11-19 17:45:50.338 X[7483:3224955] Customer: AMIRA 

2015-11-19 17:45:50.360 X[7483:3224955] Cell row: 5 section: 0 
2015-11-19 17:45:50.361 X[7483:3224955] Customer: AMPARO 

2015-11-19 17:45:50.370 X[7483:3224955] Cell row: 6 section: 0 
2015-11-19 17:45:50.371 X[7483:3224955] Customer: AMPARO 
+0

Похоже, что ваши ячейки уже используются повторно, хотя они все еще должны быть видны. Используете ли вы разные ячейки с различными идентификаторами CellIdentifiers в вашем представлении таблицы? – TheEye

+0

Да, в первых строках есть сегментированное управление, которое меняет идентификатор ячейки (и fetchresultcontroller) и вызывает метод reloaddata tableview ..., но проблема также возникает, если я не меняю сегментный выбор ... –

+0

Вы можете попробовать распечатать видимые ячейки, их указательные пути и их координаты, чтобы увидеть, что может произойти неправильно. – TheEye

ответ

0

ВНИМАНИЕ: Это не решение, это просто обходной путь!

Перезагрузка данных при быстром прокрутке пользователя помогает.

Свойства:

@property (nonatomic) CGPoint lastOffset; 
@property (nonatomic) NSTimeInterval lastOffsetCapture; 
@property (nonatomic) BOOL isScrollingFast; 

Методы:

#pragma mark - UIScrollViewDelegate 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGPoint currentOffset = scrollView.contentOffset; 
    NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate]; 

    NSTimeInterval timeDiff = currentTime - self.lastOffsetCapture; 
    if(timeDiff > 0.1) { 
     CGFloat distance = currentOffset.y - self.lastOffset.y; 

     CGFloat scrollSpeedNotAbs = (distance * 10)/1000; //in pixels per millisecond 

     //quickly scroll up 
     if (scrollSpeedNotAbs < - 3.5) { 
      self.isScrollingFast = YES; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self.tableView reloadData]; 
      }); 
      NSLog(@"Fast!"); 
     } 

     self.lastOffset = currentOffset; 
     self.lastOffsetCapture = currentTime; 
    } 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) { 
     [self scrollingFinish]; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self scrollingFinish]; 
} 

- (void)scrollingFinish { 
    //enter code here 
    if(self.isScrollingFast){ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
     }); 
     self.isScrollingFast = NO; 
    } 
} 

Не забудьте объявить < UIScrollViewDelegate> в вашем ТВЦ.

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