попытаться удалить элемент 30 из раздела 0, который содержит только 27 элементов перед обновлением - PullRequest
0 голосов
/ 20 марта 2020

*** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «попытка удалить элемент 30 из раздела 0, который содержит только 27 элементов перед обновлением» *

Я столкнулся с проблемой при просмотре коллекции перезагрузки мое приложение получает Cra sh. Мой код logi c таков: я отображаю несколько ячеек и для каждых 10 ячеек добавляю одну дополнительную ячейку для рекламы, и я думаю, что здесь возникает проблема, потому что при перезагрузке представления коллекции отсутствует путь к индексу. Я погуглил и получил некоторую информацию относительно моей проблемы cra sh. Вот некоторые из них: Документация для executeBatchUpdates: состояния завершения:

Удаление обрабатывается перед вставкой в ​​пакетные операции. Это означает, что индексы для удалений обрабатываются относительно индексов состояния представления коллекции перед пакетной операцией, а индексы для вставок обрабатываются относительно индексов состояния после всех удалений в пакетной операции.

Я не могу реализовать это в своем коде. Может кто-нибудь помочь мне в этом? Спасибо.

 override func viewDidLoad(){

   super.viewDidLoad()

   DispatchQueue.main.async {

   self.viewModel.tilbudsappenModel.addProduct(userId: self.userInfo.userID, shopId: self.shopId)            
        self.m_CollectionVw.reloadData()
    }
}

override func viewWillAppear(_ animated: Bool){
SwiftEventBus.onMainThread(self, name: "ReloadTblVw") { _ in
        self.m_CollectionVw.reloadData()
    }
if self.isFollowed == true {
        viewModel.tilbudsappenModel.removeProduct()
        DispatchQueue.main.async {
            self.viewModel.tilbudsappenModel.addProduct(userId: self.userInfo.userID, shopId: self.shopId)
            self.m_CollectionVw.reloadData()
        }
    }
}

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    // Here am getting the total items count
    numberOfOffers = viewModel.tilbudsappenModel.adNativeModel.totalItems()
    let totalNoOfOffers = numberOfOffers + (numberOfOffers / numberOfAds)
    return totalNoOfOffers        
 }


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if indexPath.row != 0 && indexPath.row % numberOfAds == 0 && !AppUserDefaults.SharedInstance.isSubscripted {
        let nativeAd: GADUnifiedNativeAd? = nil
        /// Set the native ad's rootViewController to the current view controller.
        nativeAd?.rootViewController = self

        let nativeAdCell = collectionView.dequeueReusableCell(withReuseIdentifier: "UnifiedNativeAdCell", for: indexPath)

        // Get the ad view from the Cell. The view hierarchy for this cell is defined in
        // UnifiedNativeAdCell.xib.
        let adView : GADUnifiedNativeAdView = nativeAdCell.contentView.subviews
            .first as! GADUnifiedNativeAdView

        if self.nativeAds.count > indexPath.row / numberOfAds {

            let nativeAd = self.nativeAds[indexPath.row / numberOfAds]
            adView.nativeAd = nativeAd

            nativeAd.delegate = self

            (adView.headlineView as? UILabel)?.text = nativeAd.headline
            adView.mediaView?.mediaContent = nativeAd.mediaContent
            // These assets are not guaranteed to be present. Check that they are before
            // showing or hiding them.
            (adView.bodyView as? UILabel)?.text = nativeAd.body
            adView.bodyView?.isHidden = nativeAd.body == nil

            (adView.callToActionView as? UIButton)?.setTitle(nativeAd.callToAction, for: .normal)
            adView.callToActionView?.isHidden = nativeAd.callToAction == nil

            (adView.iconView as? UIImageView)?.image = nativeAd.icon?.image
            adView.iconView?.isHidden = nativeAd.icon == nil

            (adView.starRatingView as? UIImageView)?.image = self.imageOfStars(from:nativeAd.starRating)
            adView.starRatingView?.isHidden = nativeAd.starRating == nil

            (adView.storeView as? UILabel)?.text = nativeAd.store
            adView.storeView?.isHidden = nativeAd.store == nil

            (adView.priceView as? UILabel)?.text = nativeAd.price
            adView.priceView?.isHidden = nativeAd.price == nil

            (adView.advertiserView as? UILabel)?.text = nativeAd.advertiser
            adView.advertiserView?.isHidden = nativeAd.advertiser == nil

            // In order for the SDK to process touch events properly, user interaction should be disabled.
            adView.callToActionView?.isUserInteractionEnabled = false

        }

        return nativeAdCell
    } else {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ShopOfferCell
        cellIndex = indexPath.item - indexPath.item / numberOfAds

        if let offerContent = viewModel.tilbudsappenModel.getProductItem(index: cellIndex) {
            cell.setContent(content: offerContent)
            if offerContent.imageWidth < Int(cell.contentView.frame.size.width) {
                cell.m_ImgVw.contentMode = .center
            }else {
                cell.m_ImgVw.contentMode = .scaleAspectFit
            }
        }
        return cell

    }

}

...