У меня есть табличное представление с пользовательскими ячейками (все настроены в подклассе с использованием автоматической разметки).
Ячейки загружаются нормально, отображаются нормально, все в порядке.
проблема - это когда я вставляю больше строк (внизу).Табличное представление представляет канал для сообщений, поэтому, когда пользователь прокручивает страницу до конца, перед тем, как перейти к последней ячейке, я загружаю новые сообщения и затем вставляю их в таблицу.
Когда я это делаю, яполучить этот странный глючный эффект, когда ячейки беспорядочно спускаются (позади предыдущих ячеек) на место, представление таблицы немного прокручивается вверх, грязно.
КОД ВНИЗ
Я загрузилклип меня прокручивает.Когда вы видите индикатор активности, я прекращаю прокручивать.Остальная часть движения происходит от глючного поведения.
- Это причина сбоя, потому что клетки прорисовываютсяс авторазборкой?
Я надеюсь, что нет, но я не знаю, что делать с решением.Если у кого-нибудь есть какие-либо идеи, пожалуйста, дайте мне знать.
К вашему сведению:
У меня есть это (конечно, поскольку все ячейки используют автоматическое расположение)
- (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]
, так что, возможно, я что-то не так делаю при вставке ячеек? ...