gpt4 book ai didi

ios - 一旦 iAd 的委托(delegate)方法被调用,iAd 就不会异步显示

转载 作者:IT王子 更新时间:2023-10-29 05:53:22 27 4
gpt4 key购买 nike

我已经复制了 iAdSuite with Storyboards在 swift 中,iAd 在所有 View Controller 上工作正常,除了当委托(delegate)方法 bannerViewDidLoadAd(banner: ADBannerView!) 被调用时,横幅 View 不会立即出现。我必须旋转模拟器或转到另一个选项卡,它才会出现。

我认为这是 Objective-C 中 Apple 示例代码的一部分,我无法“翻译”成 swift?这很可能导致 iAd 在加载后不异步显示...

+ (BannerViewManager *)sharedInstance
{
static BannerViewManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[BannerViewManager alloc] init];
});
return sharedInstance;
}

这是我的 BannerViewManager 类,带有 ADBannerViewDelegate 方法。

class BannerViewManager: NSObject, ADBannerViewDelegate {

// MARK: - Shared instance
static let sharedInstance = BannerViewManager()

var bannerView: ADBannerView!
var bannerViewControllers: NSMutableSet!

override init() {
super.init()

bannerView = ADBannerView(adType: .Banner)
bannerViewControllers = NSMutableSet()
bannerView.delegate = self
}

func addBannerViewController(controller: BannerViewController) {
bannerViewControllers.addObject(controller)
}

func removeBannerViewController(controller: BannerViewController) {
bannerViewControllers.removeObject(controller)
}

// MARK: - Ad banner view delegate methods

func bannerViewDidLoadAd(banner: ADBannerView!) {
NSLog("bannerViewDidLoadAd")

for bannerViewController in bannerViewControllers {
(bannerViewController as! BannerViewController).updateLayout()
}
}

func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) {
NSLog("didFailToReceiveAdWithError %@", error);

for bannerViewController in bannerViewControllers {
(bannerViewController as! BannerViewController).updateLayout()
}
}

func bannerViewActionShouldBegin(banner: ADBannerView!, willLeaveApplication willLeave: Bool) -> Bool {
NSNotificationCenter.defaultCenter().postNotificationName(BannerViewActionWillBegin, object: self)
return true
}

func bannerViewActionDidFinish(banner: ADBannerView!) {
NSNotificationCenter.defaultCenter().postNotificationName(BannerViewActionDidFinish, object: self)
}
}

编辑

我已经成功地使用 this post on SO 将上面的 objective-C 代码转换为 swift但我仍然有同样的问题。 iAd 在加载后不会出现。必须对 View 进行某种更改才能实现,旋转设备或点击另一个选项卡等...

所以现在我的 sharedInstance 看起来像这样:

    static var sharedInstance: BannerViewManager {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: BannerViewManager? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = BannerViewManager()
}
return Static.instance!
}

最佳答案

我想我知道问题出在哪里了。它与我初始化 BannerViewManager 类的共享实例的方式无关。事实上,无论是使用 dispatch_once 还是新的 swift 2.0 方式,结果都给出了完全相同的行为。

导致 iAd 在 bannerViewDidLoadAd 被调用时没有立即显示的原因是 viewDidLayoutSubviews 实际上从未被调用过!

我不得不到处添加一些打印语句。在我的代码和 Apple 示例代码中都得出了这个结论。

所以 setNeedsLayout 而不是 layoutIfNeeded 强制触发 viewDidLayoutSubviews

关于ios - 一旦 iAd 的委托(delegate)方法被调用,iAd 就不会异步显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34403372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com