Как поддерживать состояние CollectionView в разных сегментах (вкладка)

У меня есть макет потока просмотра коллекции, добавленный в качестве подпредставления внутри сегментированного элемента управления. Сегмент подразделяется на All, New, Used. Моя проблема заключается в том, как я могу поддерживать состояние представления коллекции в разных сегментах.

Я делаю вызовы API для загрузки данных по All, New, Used сегментам

Также каждый раз, когда я переключаю вкладку, я звоню [collectionView reloadData], которая перезагружает представление коллекции, но не совсем ту позицию, с которой я ушел ранее в этом конкретном сегменте

Например, в сегменте All я прокрутил 10-15 элементов, затем я переключаюсь на сегмент New и прокручиваю 3 элемента, и теперь, если я снова переключу вкладку на сегмент All, тогда позиция сегмента All также перейдет на 3-е место

Как это можно решить. Спасибо, что терпеливо читаете. Любая помощь мне очень поможет.

Вот пример кода, который я использую для переключения сегмента

-(IBAction)changeSeg:(id)sender{
    [collectionView reloadData];

    if (segmentedControl.selectedSegmentIndex == 0){
atScrollPosition:UICollectionViewScrollPositionNone animated:false];
        typeFlag = 0;
        if ([inventoryDetails count] == 0 && totalInventoryCountForAll != 0) {
            [self loadMore];
        } else if (totalInventoryCountForAll == 0) {
            [self setNoCarVisibility: true];
        }
    }
    else if (segmentedControl.selectedSegmentIndex == 1){
        typeFlag = 1;
        if ([newInventory count] == 0 && totalInventoryCountForNew != 0) {
            [self loadMore];
        } else if (totalInventoryCountForNew == 0) {
            [self setNoCarVisibility: true];
        }
    }
    else if (segmentedControl.selectedSegmentIndex == 2){
        typeFlag = 2;
        if ([usedInventory count] == 0 && totalInventoryCountForUsed != 0){
            [self loadMore];
        } else if (totalInventoryCountForUsed == 0) {
            [self setNoCarVisibility: true];
        }
    }

} 
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
109
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Может быть, вы можете сохранить indexpath текущей видимой ячейки, когда вы переключаете прокрутку вкладки на Indepath после перезагрузки данных. Надеюсь, поможет....

Редактировать Текущий indexpath каждый для 3 вкладок отдельно. Таким образом, не будет одной переменной, вместо этого будет 3 переменные indexpath, отдельные для каждой вкладки, после переключения вкладки можно управлять значениями в соответствующем var, а затем переустанавливать таким же образом.

Например, currentAllIndexpath, currentNewIndexpath и т. д.

Да, вы правы, я тоже пробовал. Но проблема в том, что я сделал вызов API для willDisplayCell, когда indexPath достигает 10-й позиции. Поэтому, когда я прокручиваю до позиции программно, он автоматически показывает индикатор загрузки, которого следует избегать. Также willDisplayCell установит текущий indexPath как последнюю прокручиваемую позицию, которую нельзя сделать уникальной для всех, новых, используемых сегментов.

BharathRao 30.05.2019 15:51

Попробовал решение, которое вы предложили в редактировании. Но, к сожалению, есть еще одна проблема с willDisplayCell. когда я переключаю вкладку, первое, что я делаю, это прокручиваю до последней выбранной позиции, но на самом деле willDisplayCell обновляет текущую переменную indexPath как последнюю прокручиваемую позицию (даже есть три отдельные переменные). Поэтому, когда я пытаюсь прокрутить indexPath перед загрузкой ячейки (приложение иногда дает сбой), оно не работает или не прокручивается точно туда, где я ушел.

BharathRao 31.05.2019 11:06
Ответ принят как подходящий

Итак, наконец, я получил быстрое решение следующим образом:

1). Я создал три представления коллекции для всех, новых, бывших в употреблении

2). Создано необходимое выходное соединение, источник данных и делегаты для всех трех представлений коллекции.

3). Хитрость заключается в том, чтобы скрыть и показать представление коллекции для текущего выбранного сегмента.

4). Но я столкнулся с небольшой проблемой здесь. Первый вид коллекции (в моем случае вкладка «Все») должен быть последним элементом в построителе интерфейса, тогда только он будет отображаться при первоначальной загрузке представления коллекции.

5). Всякий раз, когда я переключаю вкладки, я скрываю два других представления коллекции и показываю представление коллекции текущей выбранной вкладки.

Это не может быть правильным решением. Но до поры до времени я сделал это.

Другие вопросы по теме