У меня есть UITableView , где источником данных являются базовые данные с использованием NSFetchRequest . Основные данные содержат новости, загруженные из базы данных на моем веб-сайте. Базовые данные по умолчанию содержат 50 новых элементов, а старые элементы загружаются лениво, когда достигается нижняя часть UITableView.
В настоящее время я имею дело с этим методом tableView:numberOfRowsInSection
, где я возвращаю +1 для последнего раздела, который является моей ячейкой «Загрузка элементов». В методе tableView:cellForRowAtIndexPath
я создаю ячейку «Загрузка элементов», когда IndexPath является последней строкой в последнем разделе.
Проблема в том, что при загрузке новых данных ячейка, которая раньше была ячейкой «Загрузка элементов», теперь является обычной ячейкой новостей. Но затем ячейка сначала перезагружается, когда я прокручиваюсь от ячейки и возвращаюсь.
Я мог бы сохранить indexPath для ячейки «загрузка элементов» и перезагрузить эту ячейку, когда ленивая загрузка закончится. Но я хотел бы знать, существуют ли какие-либо лучшие решения этой проблемы?
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;
}