Данные загрузки 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];

        }
    }];

  }
}