обновите список представлений коллекции с помощью DiffableDataSource и reloadData

#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 элемента в представлении коллекции списков?