Загрузка N представлений UICollectionView и перезагрузка в конце - PullRequest
0 голосов
/ 04 ноября 2019

[РЕДАКТИРОВАТЬ после ответов: решение в конце вопроса]

У меня есть UICollectionView, где я первоначально загружаю 4 просмотра. Мне бы хотелось, чтобы, когда пользователь прокручивал до последнего (4-й вид) и пытался снова прокрутить, я обновляю данные своей модели, перезагружаю UICollectionView и возвращаюсь к 1-му виду, чтобы пользователь мог снова прокрутить 3 раза до4-й вид и т. д.

Проблема заключается в том, что при первоначальной загрузке 4 видов пользователь не может прокрутить после того, как достиг последнего представления, поскольку после этого ничего не происходит. Поэтому я создал пустую ячейку в качестве 5-го представления, и теперь я загружаю 5 представлений в исходном UICollectionView. Но этот 5-й вид никогда не отображается полностью, и я использую метод willDisplay, чтобы перезагрузить данные и принудительно вернуться к первому виду. Это не элегантно, но я не мог найти другой способ сделать это.

Этот метод работает нормально, но вот проблема: кажется, что когда вызывается willDisplay, я действительно перезагружаю данные и возвращаюсь кпервый вид, но только потом учитывается прокрутка, которая должна была привести меня к 5-му виду, что означает, что после того, как я вернулся к первому виду, приложение фактически показывает мне второй вид (оно вернулось к первомупросмотра, но затем применяется прокрутка, которую я инициировал для перехода с 4-го на 5-е представление, перемещая меня к 2-му виду).

Я надеюсь, что это понятно ...

Так воткод, который я использую:

override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { 
// if this is the last view       
if((indexPath.row == self.dataModel.getNumberOfData()) && self.dataModel.getNumberOfData() > 0) 
{

// I update the model here
self.dataModel.resetData()
// Then I reload the UICollectionView
self.collectionView.reloadData()
// Then I move back to the first view
self.collectionView.selectItem(at: IndexPath(item: 0, section: 0), animated: false, scrollPosition: .centeredHorizontally)
}
}

Конечно, если у вас есть другое решение, более элегантное, чтобы избежать этого 5-го представления, я буду рад рассмотреть его. Мои данные не являются статичными, поэтому, когда мне нужно перезагрузить новые данные, я запрашиваю базу данных, чтобы получить новую информацию, чтобы я не знал о новых данных при запуске приложения.

Спасибо.

[РЕДАКТИРОВАТЬ с решением, используя scrollViewDidScroll. Я показываю, например, как определить конец (горизонтальная прокрутка и удаление первого вида ...

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
// if reached the end of the UICollectionView...
if (scrollView.contentOffset.x == scrollView.contentSize.width - scrollView.frame.size.width) {
print("Reached the end...")
self.dataModel.removeNFirst(n: 1) // remove first item from model
// delete the first view of the UICollectionView
self.collectionView.performBatchUpdates({
                self.collectionView.deleteItems(at: [IndexPath(item: 0, section: 0)])
            }) { (finished) in
                self.collectionView.reloadData()
            }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...