У меня есть UITableView, где источником данных являются данные ядра с использованием NSFetchRequest. Основные данные содержат новости, загруженные из базы данных на моем веб-сайте. Основные данные по умолчанию содержат 50 новейших элементов, а более старые элементы загружаются с леними, когда достигается нижняя часть UITableView.Как добавить пользовательскую ячейку в нижней части UITableView?
В настоящее время я занимаюсь этим с использованием метода tableView:numberOfRowsInSection
, где я возвращаю +1 для последнего раздела, который является моей ячейкой «Загрузка элементов». В методе tableView:cellForRowAtIndexPath
я создаю ячейку «Загрузка элементов», когда IndexPath является последней строкой в последнем разделе.
Проблема заключается в том, что когда новые данные загружаются, ячейка, которая ранее была ячейкой «Загрузка элементов», теперь является обычной ячейкой элемента новостей. Но затем ячейка сначала перезагружается, когда я прокручиваюсь от камеры и возвращается.
Я мог бы хранить indexPath для ячейки «loading items» и перезагрузить эту ячейку, когда ленивая загрузка закончена. Но я хотел бы знать, существуют ли какие-либо лучшие решения этой проблемы?
EDIT1:
Вот моя процедура для создания "пунктов погрузки" UITableViewCell.
cell.textLabel.text = [NSString stringWithFormat:@"%@\u2026", NSLocalizedString(@"LOADING_MORE", nil)];
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UIImage *spacer = [UIImage imageNamed:@"Spacer"];
UIGraphicsBeginImageContext(spinner.frame.size);
[spacer drawInRect:CGRectMake(0,0,spinner.frame.size.width,spinner.frame.size.height)];
UIImage* resizedSpacer = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
cell.imageView.image = resizedSpacer;
[cell.imageView addSubview:spinner];
[spinner startAnimating];
EDIT2:
Я пытаюсь "дизайн" footerView, используя приведенный ниже код. В настоящее время индикатор активности находится в верхнем левом положении, и метка не видна.
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
NSInteger sectionsAmount = [tableView numberOfSections];
if (section == sectionsAmount - 1) {
return 20;
}
return 0;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
NSInteger sectionsAmount = [tableView numberOfSections];
if (section == sectionsAmount - 1) {
if (_tableFooterView==nil) {
UIView *view = [[UIView alloc] init];
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UIImage *spacer = [UIImage imageNamed:@"Spacer"];
UIGraphicsBeginImageContext(spinner.frame.size);
[spacer drawInRect:CGRectMake(0,0,spinner.frame.size.width,spinner.frame.size.height)];
UIImage* resizedSpacer = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = resizedSpacer;
[imageView addSubview:spinner];
[spinner startAnimating];
[view addSubview:imageView];
UILabel *label = [[UILabel alloc] init];
label.text = [NSString stringWithFormat:@"%@\u2026", NSLocalizedString(@"LOADING_MORE", nil)];
[view addSubview:label];
_tableFooterView = view;
}
return self.tableFooterView;
}
return nil;
}
Как я могу изменить UIView, чтобы выглядеть, как на рисунке ниже:
EDIT3:
Вот мой setupTableFooterView где я назначая вид на tableFooterView
. Метод вызывается из окна viewDidLoad.
- (void) setupTableFooterView {
UIView *view = [[UIView alloc] init];
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UIImage *spacer = [UIImage imageNamed:@"Spacer"];
UIGraphicsBeginImageContext(spinner.frame.size);
[spacer drawInRect:CGRectMake(0,0,spinner.frame.size.width,spinner.frame.size.height)];
UIImage* resizedSpacer = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = resizedSpacer;
[imageView addSubview:spinner];
[spinner startAnimating];
imageView.frame = CGRectMake(10, 11, 20, 20);
[view addSubview:imageView];
UILabel *label = [[UILabel alloc] init];
label.text = [NSString stringWithFormat:@"%@\u2026", NSLocalizedString(@"LOADING_MORE", nil)];
[label setFont:[UIFont italicSystemFontOfSize:13]];
[label setFrame:CGRectMake(40, 0, 270, 43)];
[view addSubview:label];
self.tableView.tableFooterView = view;
}
Спасибо за ваш комментарий, я думаю, это может быть решением для меня. Я безуспешно пытаюсь настроить tableFooterView. Не могли бы вы взглянуть на мой «EDIT2»? – dhrm
Вы внедряете sectionFooter, я предлагаю использовать tableFooter. Конечно, sectionFooter - это вариант, но я бы рекомендовал вместо этого использовать tableFooter. Проверьте ссылку, пожалуйста. – Till
Извините, вы, где правильно. Я добавил инициализацию вида в * viewDidLoad *. Не могли бы вы увидеть мой «EDIT3»? – dhrm