UITableView Cell Вставка Строка Glitch - PullRequest
0 голосов
/ 02 мая 2019

У меня есть табличное представление с пользовательскими ячейками (все настроены в подклассе с использованием автоматической разметки).

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

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

Когда я это делаю, яполучить этот странный глючный эффект, когда ячейки беспорядочно спускаются (позади предыдущих ячеек) на место, представление таблицы немного прокручивается вверх, грязно.

КОД ВНИЗ

Я загрузилклип меня прокручивает.Когда вы видите индикатор активности, я прекращаю прокручивать.Остальная часть движения происходит от глючного поведения.

enter image description here


  • Это причина сбоя, потому что клетки прорисовываютсяс авторазборкой?

Я надеюсь, что нет, но я не знаю, что делать с решением.Если у кого-нибудь есть какие-либо идеи, пожалуйста, дайте мне знать.

К вашему сведению:

У меня есть это (конечно, поскольку все ячейки используют автоматическое расположение)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

Я пытался установить предполагаемую высоту равной «среднему» ожидаемой высоты ячейки, около 65. Без разницы.

Обновление

Вот код:

HomeViewController.m -> viewDidLoad

...
self.tableView = [KATableView.alloc initWithFrame:CGRectZero style:UITableViewStylePlain];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.refreshDelegate = self;

self.tableView.estimatedRowHeight = 75;
self.tableView.rowHeight = UITableViewAutomaticDimension;

[self.view addSubview:self.tableView];

// Constrains to all 4 sides of self.view
[SSLayerEffects constrainView:self.tableView toAllSidesOfView:self.view];

мой источник данных представления таблицы

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (!self.dataManager.didFinishFetchingData) return 4;
    if (self.contentObjects.count == 0) return 1;
    if (self.dataManager.moreToLoad) return self.contentObjects.count + 1;
    return self.contentObjects.count + 1;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    MYObject *object = self.contentObjects[indexPath.row];
    SomeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:object.documentID];

    if (!cell) {
        cell = [SomeTableViewCell.alloc initWithStyle:UITableViewCellStyleDefault reuseIdentifier:object.documentID];
            cell.delegate = self;
    } else [cell startListeningForChanges];


    return cell;

}

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

- (void)getHomeFeedData:(nullable void(^)(BOOL finished))completed {

    [self.dataManager fetchHomeFeedDataForFeedOption:self.homeNavController.feedFilterOption completion:^(NSError * _Nullable error, NSArray<__kindof KAObject *> * _Nullable feedObjects) {

        if (error != nil) {
            NSLog(@"something went wrong: %@", error.localizedDescription);
            if (completed) completed(NO);
            return;
        }

        NSInteger originalCount = self.contentObjects.count;

        if (self.dataManager.isFirstTimeLoading) self.contentObjects = feedObjects.mutableCopy;
        else {
            if (self.dataManager.isGettingNew) for (MYObject *obj in feedObjects) [self.contentObjects insertObject:obj atIndex:0];
            else if (feedObjects.count > 0) [self.contentObjects addObjectsFromArray:feedObjects];
        }


        if (feedObjects.count > 0) {
            if (self.dataManager.isFirstTimeLoading) [self.tableView reloadData];
            else {
                [self.tableView insertCells:feedObjects forSection:0 startingIndex:self.dataManager.isGettingNew? 0 : originalCount];
            }
        } else if (self.dataManager.isFirstTimeLoading) [self.tableView reloadData];


        if (completed) completed(YES);

    }];

}

ПРИМЕЧАНИЕ:

[self.tableView insertCells:feedObjects forSection:0 startingIndex:self.dataManager.isGettingNew? 0 : originalCount];

просто так:

- (void)insertCells:(nullable NSArray *)cells forSection:(NSInteger)section startingIndex:(NSInteger)start {

    if (!cells) return;

    NSMutableArray *indexPaths = @[].mutableCopy;

    for (id obj in cells) {
        NSInteger index = [cells indexOfObject:obj] + start;
        [indexPaths addObject:[NSIndexPath indexPathForRow:index inSection:section]];
    }

    [self insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];

}

Обновление 2

Мой UITableViewCell контент подкласса скрыт банкоматом (слишком много трудностей при редактировании всего контента моего поста для целей этого поста).У меня просто подпредставления каждой ячейки установлены на alpha = 0.f.Это просто изображение, несколько ярлыков и несколько кнопок.

В консоли нет проблем с ограничениями , ячейки прекрасно отображаются при вызове [self.tableView reloadData], так что, возможно, я что-то не так делаю при вставке ячеек? ...

1 Ответ

1 голос
/ 02 мая 2019

Когда вы имеете дело с UITableView глюками:

  1. Убедитесь, что вы вызываете UIKit API в главном потоке - включите проверку основного потока

enter image description here

В вашем случае может возникнуть проблема, связанная с тем, что fetchHomeFeedDataForFeedOption:completion: блок завершения вызывается не в главном потоке.

Ваша вставка определенно неверна - все вызовы удаления / вставки / обновления / перемещения для UITableView должны быть заключены в beginUpdates / endUpdates

Your "загрузить больше "компонент в нижней части может быть проблемой.Вы должны обратиться к тому, как он управляет contentSize / contentOffset / contentInset табличного представления.Если он что-то делает, кроме манипулирования contentInset - он делает неправильную работу.

Хотя трудно без отладки всего решения, я уверен, что варианты 2 и 3 являются ключевыми проблемами.

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