UITableView вставляет больше строк, сохраняя уже загруженные

Ниже приведена функция, которую я использую для получения и анализа разных страниц фида.

- (void)getFeed:(NSInteger) pageNumber
{
    collectedData = [[NSMutableData alloc] init];
    NSString *urlStr =[NSString stringWithFormat:@"http://sitename.com/feed/?paged=%d", pageNumber];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];
}

Когда пользователь прокручивается до нижней части таблицы, я использую следующую функцию для доступа ко второй странице фида и т. Д. Путем увеличения счетчика:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    {
        counter ++;
        [self getFeed:counter];
    }
}

Проблема заключается в том, что вместо того, чтобы загружать его ниже уже взятых элементов, он перезагружает табличное представление, чтобы отображать новые элементы страницы, а старые исчезают. Я хочу загрузить новые элементы страницы ниже существующих, чтобы иметь бесконечную прокрутку. Как я могу это сделать?

8

7 ответы

Нехорошо отвечать на собственный вопрос, но, помогая другим форумом, я смог выяснить ответ.

Контроллер tableview не синхронизировался с изменяемым массивом, поэтому я создал другой и добавил оба массива.

Шаг 1: Я создал свойство

@property (nonatomic, readonly) NSMutableArray *moreItems;

Шаг 2. Инициализировал массив в ViewDidLoad перед вызовом fetchEntries

moreItems = [[NSMutableArray alloc] init];

Шаг 3: В connectionDidFinishLoading я добавил новый массив «moreItems» в предыдущие элементы массива,

[moreItems addObjectsFromArray:[channel items]];

Шаг4: Изменен источник данных в numberOfRowsInSection из

return [[channel items] count];

к новому массиву

return [moreItems count];

а затем в cellForRowAtIndexPath, используется новый массив

RSSItem *item = [moreItems objectAtIndex:[indexPath row]];
2
добавлено

После того, как вы закончите получение нового фида для следующей страницы, получите объекты в массиве. Добавьте эти объекты из этого массива в ваш массив источников данных. Теперь вставьте строки в таблицу следующим образом:

[yourTable beginUpdates];
[yourTable insertRowsAtIndexPaths:indexPathsToInsert
                 withRowAnimation:UITableViewRowAnimationBottom];
[yourTable endUpdates];

где «indexPathsToInsert» - это массив объектов NSIndexPath, начиная с последней строки в вашей таблице и контактируя с indexPaths для ваших новых объектов.

Надеюсь это поможет.

1
добавлено

Всякий раз, когда ваш массив получает новый добавленный объект, вы вызываете это

-(void)insertRowInTableView
 {
   int row = [YourDataSourceArray count];
   NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
   NSArray *indexPaths = [NSArray arrayWithObject:indexPath];
   [YourTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
 }

Здесь YourDataSourceArray - это массив, из которого вы устанавливаете счетчик/данные строки таблицы. YourTableView - это имя объекта tableView.

1
добавлено
Я знаю, но я не знаю, как использовать эту функцию
добавлено автор Jessica, источник
lemme попробуйте этот
добавлено автор Jessica, источник
к сожалению, я не могу использовать эту программу в своей программе.
добавлено автор Jessica, источник
просто отредактировал мой ответ
добавлено автор spider1983, источник

Здравствуй,

Создайте цикл for, с начальным индексом (количество объектов в источнике данных) и количеством объектов, которые вы хотите добавить (количество), создайте массив индексных путей и вызовите insertRowsAtIndexpaths: withRowAnimation. Надеюсь, код поможет вам.

    NSInteger statingIndex = [self.tableViewDatasource count];
    NSInteger noOfObjects = //Get the no.of objects count from getFeed method.
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init];

    for (NSInteger index = statingIndex; index < statingIndex+noOfObjects; index++) {

        [_objects addObject:];//add the object from getFeed method.
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
        [indexPaths addObject:indexPath];
        [indexPath release];

    }

    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
1
добавлено
lemme проверить это тоже
добавлено автор Jessica, источник

Вы должны использовать метод insertRowsAtIndexPaths: withRowAnimation: для UITableView .

One thing you must take care of is that when you use this method, number rows retuned by tableView:numberOfRowsInSection should be equal to number_of_existing_rows + number_of_newly_inserted_rows

1
добавлено

Возможно, это связано с тем, что когда вы получаете данные из веб-сервиса, вы добавляете его в массив, который вы используете для заполнения таблицы, тем самым у вас будут только новые данные, вам нужно добавить новый данные в массив (сделайте его Mutable Array и добавьте новые данные) и просто используйте следующую строку

[your_Table reloadData];

Надеюсь, что это поможет вам.

0
добавлено
Я уже делаю это, но это не решение моей проблемы. Я должен использовать insertRowsAtIndexPaths, но я не знаю, как
добавлено автор Jessica, источник
в конце уже взятых строк
добавлено автор Jessica, источник
Я уже использую NSMutableArray, который содержит элементы
добавлено автор Jessica, источник
вы хотите, чтобы ваши новые данные находились в определенной строке.
добавлено автор superGokuN, источник
@Jessica, если вы хотите их в конце уже взятых строк, то почему вы ищете для insertRowsAtIndexPaths. Просто сделайте так, как я сказал, сделайте iVar NSMutableArray * your_Array и каждый раз, когда вы вызываете свою службу, добавляете новые данные в массив, эти новые данные будут автоматически отправляться в конце предыдущих данных и после этого просто перезагружать таблицу [Your_Table reloadData];
добавлено автор superGokuN, источник

Вместо того, чтобы использовать прокрутку вниз для загрузки, лучше использовать последнюю строку tableview как «Загрузить дополнительные элементы», и когда пользователь выбрал эту строку, получите новый канал и перезагрузите таблицу.

А также у меня есть одно сомнение в вашем коде, каждый раз в методе getfeed вы создаете массив
collectedData. Я сомневаюсь, что вам не хватает добавления этих данных в данные таблицы данных, что может привести к тому, что вы покажете только последние данные фида в tableview. пожалуйста, проверьте

0
добавлено
использование tableviewfooter вместо прокрутки донизу также возможно. Я думаю, что сейчас я должен сосредоточиться на главной проблеме
добавлено автор Jessica, источник
нет, это код по умолчанию из шаблона masterdetail, он просто добавляет строки вверху
добавлено автор Jessica, источник
Привет, Проверьте этот код ниже. Сначала вам нужно вставить данные в источник данных и создать вызов insertRowsAtIndexPaths: withRowAnimation.
добавлено автор purnachandra.tech, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.