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
}
}
希望对您有所帮助。
我想在我的应用程序中添加广告,例如原生广告或视差广告。
该应用程序主要是一个 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
}
}
希望对您有所帮助。