iOS - 如何在数据准备好后以编程方式初始化和插入 UICollectionViewCell?

iOS - How to init and insert UICollectionViewCell programmatically when data is ready?

我想在我的应用程序中添加广告,例如原生广告或视差广告。

该应用程序主要是一个 UICollectionView,其中包含许多显示不同信息的单元格。

我正在使用 SDK 来加载广告对象。

我制作了自定义 UICollectionViewCell class 以初始化单元格并将原生广告作为我的 UICollectionView 中的单元格加载。

@objc class AdsCollectionViewCell: BaseCollectionViewCell, AdapterAdsDelegate {

    @IBOutlet var outletNativeTitle: UILabel!
    @IBOutlet var outletImageNative: UIImageView!
    @IBOutlet var outletButtonAction: UIButton!
    @IBOutlet var clickableView: UIView!
    @IBOutlet var mediaContainer: UIView!
    @IBOutlet var bottomView: UIView!

    var adFactory = AdsSDKFactory()
    var adObject = AdsObject()

    @objc func initCell(viewController: HomeViewController) {

        DispatchQueue.main.async {
            self.isHidden = true
        }

        // Set some properties for the Ads SDK
        adFactory.nativeDelegate = self
        adObject.viewController = viewController

        adFactory.placementId = "154569"

        // method from the SDK to request the Ad  
        adFactory.loadAds()
    }

它工作正常,但我的主要问题是我显示的是一个空单元格,当我使用广告对象从广告 SDK 获取委托响应方法时显示内容。

这是我在 AdsCollectionViewCell 中收到的委托方法。

func adObjectDidLoad(adView: AdsObject!) {

    self.adObject = adView
    self.updateCellOutlets() // my method to update labels from the adView
    self.setNeedsDisplay()

    self.delegate.tileCellDidSucceed!(self)
}

我想先在我的 HomeViewController 中初始化并调用 adFactory.loadAds,这样当我得到委托响应和 adObject 时,我不会直接 ​​updateCellOutlets 但我可以 self.delegate.tileCellDidSucceed!(self) 这是我的 BaseCollectionViewCell 的委托,以便通知我的 HomeViewController 单元已准备就绪。

如何在 cellForRow 方法之外初始化单元格以在加载广告时动态插入它?

编辑: 我听从了建议并创建了一个 Singleton AdsLoader class,它设置了请求广告的所有参数,并发出加载请求。 我将我的 HomeViewController 设置为委托,这样我就可以直接在我的 HomeViewController 中获取视图广告作为响应。

我现在的问题是在 collectionView 的正确 indexPath 处插入对象。我应该插入哪个对象?

我无法清楚地了解您的 AdSDK 的代码和具体要求。所以我会继续写一个 伪代码 根据我对需要做什么的理解。这就是我的目的,而不是将 adFactory.loadAds() 调用到 UICollectionViewCell 对象中,您可以在不同的 class 对象中执行此任务。假设 AdLoader

所以你的添加加载器应该是这样的。

class Adloader {

var adFactory = AdsSDKFactory()

typealias adLoadCompletionHandler = (adView: AdsObject) -> Void

var loadCompletion
 func initLoader() {
   //Set some properties for the Ads SDK
    adFactory.nativeDelegate = self

   // method from the SDK to request the Ad  
    adFactory.loadAds()
  }
}

加载广告后,您可以使用完成处理程序来更新集合视图。

func adObjectDidLoad(adView: AdsObject!) {
    adLoadCompletionHandler(adView)
}

所以你的代码可以是这样的。

if (needToInsertAd) {
   var newAd = Adloader.initLoader()
   newAd.adLoadCompletionHandler {
       //Code to insert cell at indexpath
   }
}

希望对您有所帮助。