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

时间:2018-02-05 11:09:56

标签: ios swift uicollectionview uicollectionviewcell

我想在我的应用中添加广告,例如Native Ads或Parallax。

App主要是一个UICollectionView,其中有许多单元格显示不同的信息。

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

我创建了一个自定义UICollectionViewCell类,以便在我的UICollectionView中初始化单元格并将Native Ad加载为单元格。

@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()
    }

它正在运行,但我的主要问题是我正在显示一个空单元格,当我从带有广告对象的Ad 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类,该类设置了请求广告的所有参数,并且还发出了加载请求。 我将HomeViewController设置为委托,以便我可以直接在HomeViewController中将视图广告作为响应。

我现在的问题是在右侧indexPath的collectionView中插入object。我应该插入哪个对象?

1 个答案:

答案 0 :(得分:1)

我无法清楚了解AdSDK的代码和具体要求。因此,根据我对需要完成的工作的理解,我将继续写一个伪代码。这是我的目的,而不是将adFactory.loadAds()调用到UICollectionViewCell对象中,您可以将此任务执行到另一个类对象中。我们说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
   }
}

希望这会对你有所帮助。