Ошибка числа элементов в разделе 0, когда в представлении коллекции только 0 разделов

Я хочу научиться использовать UICollectionViewDiffableDataSource с помощью Pinterest Layout, но когда я пытаюсь запустить свой симулятор. он вылетает и дает мне сообщение

запрос количества элементов в разделе 0, когда в представлении коллекции только 0 разделов

Я сделал макет Pinterest, используя руководство Raywenderlich, когда я спотыкаюсь в Google, причиной проблемы является макет Pinterest. но до того, как я использую diffableDataSource, он работает нормально, но после использования diffableDataSource происходит сбой. где я делаю не так? Вы можете мне помочь, это мой код для diffableDataSource

    // This is in my PhotoViewController
    enum Section {
        case main
    }

    let layout = PinterestLayout()
    var dataSource: UICollectionViewDiffableDataSource<Section, PhotoItem>!
    var photos: [PhotoItem] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "Photos"
        navigationController?.navigationBar.prefersLargeTitles = true
        setupCollectionView()
        getPhoto()
        configureDataSource()
    }

    private func getPhoto() {
        NetworkManager.shared.getPhotos(matching: "office", page: 1) { [weak self] result in
            guard let self = self else { return }

            switch result {
            case .success(let photos):
                self.photos = photos
                self.updateData()
            case .failure(let error):
                print(error)
            }
        }
    }

    private func configureDataSource() {
        dataSource = UICollectionViewDiffableDataSource<Section, PhotoItem>(collectionView: collectionView, cellProvider: { (collectionView, indexPath, photoItems) -> UICollectionViewCell? in
            let cell = collectionView.dequeueReusableCell(withClass: PhotoCell.self, for: indexPath)
            cell.set(photoItems)
            return cell
        })
    }

    private func updateData() {
        var snapshot = NSDiffableDataSourceSnapshot<Section, PhotoItem>()
        snapshot.appendSections([.main])
        snapshot.appendItems(photos)
        DispatchQueue.main.async { self.dataSource.apply(snapshot, animatingDifferences: true) }
    }

    private func setupCollectionView() {
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 0
        collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: layout)
        collectionView.register(cellWithClass: PhotoCell.self)
        collectionView.backgroundColor = .systemBackground

        if let layout = collectionView.collectionViewLayout as? PinterestLayout {
            layout.delegate = self
        }

        view.addSubview(collectionView)
        collectionView.fillToSuperview()
    }

    extension PhotosViewController: PinterestDelegate {
    func collectionView(_ collectionView: UICollectionView, heightForPhotoAtIndexPath indexPath: IndexPath) -> CGFloat {
        return 200
    }
}

1 ответ

Вы должны назначить свой объект NSDiffableDataSource своему источнику данных CollectionView:

collectionView.dataSource = источник данных