#ios #swift #listview #uicollectionview
Вопрос:
Я работаю над списком представлений коллекции, и теперь все работает нормально, но у меня есть один вопрос для обновления всего списка представлений коллекции, который заключается в том, обновляет ли метод reloadData() indexPath элементов представления коллекции списка или нет.
class ListViewController: UIViewController {
private var collectionViewDataSource: UICollectionViewDiffableDataSource<Section, Event>?
private let eventListView = eventListView()
private var targetEventIndex = Int()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(eventListView)
eventListView.frame = CGRect(origin: .zero, size: view.bounds.size)
configureDataSource()
}
func configureDataSource() {
let cellRegistration = UICollectionView.CellRegistration<UICollectionViewListCell, Event> { cell, indexPath, event in
var content = UIListContentConfiguration.subtitleCell()
content.image = UIImage(systemName: "video")
cell.contentConfiguration = content
let moreAction = UIAction(image: UIImage(systemName: "ellipsis.circle"),
handler: { _ in
let vc = EventActionModalViewController();
vc.modalPresentationStyle = .overCurrentContext
self.targetEventIndex = indexPath.row
self.tabBarController?.present(vc, animated: false, completion: nil)
})
let moreActionButton = UIButton(primaryAction: moreAction)
let moreActionAccessory = UICellAccessory.CustomViewConfiguration(
customView: moreActionButton,
placement: .trailing(displayed: .whenEditing, at: { _ in return 0 })
)
cell.accessories = [
.disclosureIndicator(displayed: .whenNotEditing),
.customView(configuration: moreActionAccessory)
]
}
collectionViewDataSource = UICollectionViewDiffableDataSource<Section, Event>(collectionView: eventListView.collectionView) {
collectionView, indexPath, event in
collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: event)
}
}
func populateCV() {
var snapshot = NSDiffableDataSourceSnapshot<Section, Event>()
snapshot.appendSections([.eventList])
snapshot.appendItems(eventDataSource.events)
collectionViewDataSource?.apply(snapshot, animatingDifferences: true)
eventListView.collectionView.reloadData()
}
func addEvent(eventTitle: String) {
// add new event in the array
// the new event is placed at the 0 index of the array, so all of the events' index is going to change, so I need to update the indexPath of list collection view.
eventDataSource.save(eventTitle: eventTitle) {
self.populateCV()
}
}
}
Проблема, с которой я сталкивался раньше, заключалась в том, что при добавлении события с помощью addEvent
функции я мог обновить только пользовательский интерфейс для представления коллекции списков. Итак, я имею в виду обновление только пользовательского интерфейса, представление коллекции списков содержит новое событие, но расширение новых добавленных элементов не обновляется, если я добавляю более двух элементов последовательно. Так, например, когда я попытался удалить второй элемент сверху (который должен быть индексом 1), первый элемент (индекс 0) был удален. В то время я не включал код eventListView.collectionView.reloadData()
в функцию populateCV.
Поскольку я добавил eventListView.collectionView.reloadData()
код сейчас, я вижу, что расширение новых добавленных элементов успешно обновлено. Я прочитал документацию по reloadData, и в ней говорится reload all the data that is used to construct the table
, но в данном случае reload all the data
также включает обновление indexPath элемента в представлении коллекции списков?