У меня есть мой метод cellForRowAtIndexPath
делегата определяется так:UITableView вызова метода делегата, когда DataSource пуст
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PLOTCheckinTableViewCell *cell = (PLOTCheckinTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CheckinCellIdentifier forIndexPath:indexPath];
if([self.items count] == 0){
return cell;
}
NSDictionary *checkin = self.items[indexPath.row];
// configure and return custom cell
}
Я использую пользовательский класс клеток (PLOTCheckinTableViewCell
).
У меня возникла проблема, когда пользователь потянул, чтобы обновить, а затем попытаться вытащить ее еще до завершения первого запроса (по завершении запроса я перезагружу данные таблицы). Когда они это сделают, приложение потерпит крах и скажет, что indexPath.row
был в основном за пределами границ, т.е. массив был пуст.
Поместив это IF
, проверьте выше, я смягчил крах.
Однако
Почему именно не делаю мою
IF
проверки «работа», я вижу никаких видимых последствий возвращения клетки, прежде чем он был настроен. Это запутываетЕсть ли какие-либо лучшие способы защиты от этого события (т. Е. Данные таблицы перезагружаются пустым массивом)? Конечно,
numberOfRowsInSection
вернул быarray count
, который был бы 0? (Если он был пустой массив)
EDIT (далее код)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
float count = [self.items count];
return count;
}
- (void)resetData {
self.items = [NSMutableArray array];
}
-(void) refreshInvoked:(id)sender forState:(UIControlState)state {
[self resetData];
[self downloadHomeTimeline];
[self.refreshControl endRefreshing];
}
- (void)downloadHomeTimeline {
[self.apiClient homeTimeline:self.page completionBlock:^(NSDictionary *data){
for (NSDictionary *obj in data[@"items"]) {
[self.items addObject:obj];
}
[self.itemsTableView reloadData];
}];
}
Может быть, это поможет увидеть реализацию для pull для refresh и numberOfRowForSection, если есть что-то вроде второго pull, изменяет содержимое массива items после того, как numberOfRowForSection вернул ненулевое число. Недавно я заметил, что есть заметная задержка после того, как numberOfRowForSection вернулся и вызывается cellForRowAtIndexPath. – Antenehs
@Antenehs yep, это звучит правильно. Отредактированный вопрос для ясности – benhowdle89
Вы должны вернуть счетчик 'items' в' numberOfRowsInSection: 'и' reloadData' в представлении таблицы, как только 'items' будет заполнен допустимыми данными. –