У меня есть макет потока просмотра коллекции, добавленный в качестве подпредставления внутри сегментированного элемента управления. Сегмент подразделяется на 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];
}
}
}





Может быть, вы можете сохранить indexpath текущей видимой ячейки, когда вы переключаете прокрутку вкладки на Indepath после перезагрузки данных. Надеюсь, поможет....
Редактировать Текущий indexpath каждый для 3 вкладок отдельно. Таким образом, не будет одной переменной, вместо этого будет 3 переменные indexpath, отдельные для каждой вкладки, после переключения вкладки можно управлять значениями в соответствующем var, а затем переустанавливать таким же образом.
Например, currentAllIndexpath, currentNewIndexpath и т. д.
Попробовал решение, которое вы предложили в редактировании. Но, к сожалению, есть еще одна проблема с willDisplayCell. когда я переключаю вкладку, первое, что я делаю, это прокручиваю до последней выбранной позиции, но на самом деле willDisplayCell обновляет текущую переменную indexPath как последнюю прокручиваемую позицию (даже есть три отдельные переменные). Поэтому, когда я пытаюсь прокрутить indexPath перед загрузкой ячейки (приложение иногда дает сбой), оно не работает или не прокручивается точно туда, где я ушел.
Итак, наконец, я получил быстрое решение следующим образом:
1). Я создал три представления коллекции для всех, новых, бывших в употреблении
2). Создано необходимое выходное соединение, источник данных и делегаты для всех трех представлений коллекции.
3). Хитрость заключается в том, чтобы скрыть и показать представление коллекции для текущего выбранного сегмента.
4). Но я столкнулся с небольшой проблемой здесь. Первый вид коллекции (в моем случае вкладка «Все») должен быть последним элементом в построителе интерфейса, тогда только он будет отображаться при первоначальной загрузке представления коллекции.
5). Всякий раз, когда я переключаю вкладки, я скрываю два других представления коллекции и показываю представление коллекции текущей выбранной вкладки.
Это не может быть правильным решением. Но до поры до времени я сделал это.
Да, вы правы, я тоже пробовал. Но проблема в том, что я сделал вызов API для willDisplayCell, когда indexPath достигает 10-й позиции. Поэтому, когда я прокручиваю до позиции программно, он автоматически показывает индикатор загрузки, которого следует избегать. Также willDisplayCell установит текущий indexPath как последнюю прокручиваемую позицию, которую нельзя сделать уникальной для всех, новых, используемых сегментов.