Данные загрузки UItableView для прокрутки
В моем приложении я получаю данные из веб-сервиса, и я должен отображать его в UITableView.
Но здесь условие состоит в том, что я должен сначала отобразить только 10 записей, а затем, как только пользователь прокрутит вниз, мне нужно загрузить больше записей. Я попытался выполнить поиск, но не получил никакого полезного ответа.
Я согласен, что буду использовать -
(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
чтобы отобразить это значение, но как я получу только 10 записей из службы, а затем другую запись на основе прокрутки.
Укажите несколько указателей или пример кода.
Спасибо
Ответы
Ответ 1
В случае, если кому-то это нужно, я смог решить эту проблему таким образом.
Во-первых, вам нужна конфигурация сервера таким образом, чтобы она возвращала 10 данных за раз в зависимости от строки, которая видна в TableView.
Это делегат tableView, который вызывается и возвращает видимые ячейки в tableView
-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
int lastRow=[nameArray count]-1;
if(([indexPath row] == lastRow)&&(lastRow<[categoryArray count]))
{
if(tableView==m_pDetailsTableView) {
savedScrollPosition=lastRow;
startCellValue=[NSString stringWithFormat:@"%d",0];
endCellValue=[NSString stringWithFormat:@"%d",[nameArray count]+10];
[self connectToServer]; //Method to request to server to get more data
}
}
}
Сохраненная переменная scrollPosition сохраняет переменную как точку, в которой вы хотите прокрутить представление таблицы после загрузки данных.
Ответ 2
Вы должны прочитать о ленивой загрузке. Код доступен на веб-сайте Apple. Загрузите его здесь.
http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html
проверьте код
- (void)loadImagesForOnscreenRows
метод.
Он использует тот же подход, который вам нужен. Он получает текущую позицию прокрутки в виде таблицы и на основании этого он отображает ячейки, отображаемые на экране, и их индексную таблицу. Исходя из этого, вы сможете отображать те ячейки, которые показаны на экране.
Для показа 10 строк требуется простой расчет.
Ответ 3
Просто вставьте новые данные в свой источник данных
см. ниже
Если вы используете xml - посмотрите XMLReader - превратите XML в NSDictionary
этот примерный код ниже использует AFNetworking (который не блокирует)
https://github.com/AFNetworking/AFNetworking/
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (!decelerate)
{
[self fetchMoreData];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self fetchMoreData];
}
- (void)fetchMoreData
{
if ([resultArray count] > 0)
{
NSArray *visiblePaths = [myTableView indexPathsForVisibleRows];
NSIndexPath *lastRow = [visiblePaths lastObject];
// Check whether or not the very last row is visible.
NSInteger numberOfSections = [myTableView numberOfSections];
NSInteger lastRowSection = [lastRow section];
NSInteger lastRowRow = [lastRow row];
NSInteger numberOfRowsInSection = [myTableView numberOfRowsInSection:lastRowSection];
if (lastRowSection == numberOfSections - 1 &&
lastRowRow== numberOfRowsInSection - 1) {
DLog(@"it the last row");
if ([resultArray count]%10 == 0) { // use a divider based on your pagination
[self fetchNextPage];
}
}
}
}
-(void)getFeeds{
ENTER_METHOD;
[resultArray removeAllObjects];
//reset this
NSString *url = [NSString stringWithFormat:@"/webserviceurl.xml?offset=0"];
[httpClient getPath:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
[self parseFeedsXMLString:operation.responseString];
// offset = offset + 10; // ONLY if there results increment
} failure:^(AFHTTPRequestOperation *operation, id responseObject){
NSString *detailError=nil;
}];
}
-(void)fetchNextPage{
NSString *url = [NSString stringWithFormat:@"/webserviceurl.xml?offset=%d",offset];
[httpClient getPath:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
DLog(@"operation.responseString:%@",operation.responseString);
[self parseNextFeedsXMLString:operation.responseString];
// offset = offset + 10; // ONLY increment if there results
} failure:^(AFHTTPRequestOperation *operation, id responseObject){
}];
}
- (void)parseFeedsXMLString:(NSString *)xmlString
{
NSError *parseError = nil;
NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:xmlString error:&parseError];
DLog(@"xmlDictionary:%@",xmlDictionary);
resultArray = [[NSMutableArray arrayWithArray:[[xmlDictionary objectForKey:@"feed"] objectForKey:@"entry"]]retain];
[myTableView reloadData];
}
-(void)parseNextFeedsXMLString:(NSString *)xmlString
{
NSError *parseError = nil;
NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:xmlString error:&parseError];
DLog(@"xmlDictionary:%@",xmlDictionary);
//[resultArray insertObject:e atIndex:[resultArray count]];
NSMutableArray *results = [NSMutableArray arrayWithArray:[[xmlDictionary objectForKey:@"feed"] objectForKey:@"entry"]];
if ([results count]) {
page++;
for (NSDictionary *dict in results) {
[resultArray insertObject:dict atIndex:[results count]];
}
}
[myTableView reloadData];
}
Ответ 4
Если я правильно понимаю ваш вопрос, вы можете сделать следующее.
1) реализовать scrollViewDidScroll
2) проверьте видимые строки в этом
3), если вы обнаружили, что последняя строка просто вызывает веб-службу для загрузки больше данных
4) при получении данных просто перезагрузите таблицу
Попробуйте.
Ответ 5
Вы можете отрегулировать возвращаемое значение метода tableView:numberOfRowsInSection:
, каждый раз, когда вы хотите вставить десять строк, вы можете добавить плюс к возвращаемому значению.
извините за мой плохой английский.
Ответ 6
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger lastSectionIndex = [tableView numberOfSections] - 1;
NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1;
if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) {
i = i +10;
NSString *unescaped = mySearchBar.text;
NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
[PServiceAPI searchKeyWord:escapedString withOffSet:i Handler:^(NSArray *results, NSError *error) {
if (error == nil) {
[arBase addObjectsFromArray:results];
[myTableView2 reloadData];
}
}];
}
}