一旦调用其委托方法,iAd就不会异步显示

时间:2015-12-21 19:55:49

标签: ios objective-c swift iad

我已经在swift中复制了iAdSuite with Storyboards,并且iAd在所有视图控制器中都可以正常工作,除了调用委托方法bannerViewDidLoadAd(banner: ADBannerView!)时,横幅视图不会立即显示。我必须旋转模拟器或转到另一个标签,以便它出现。

我认为这是Objective-C中Apple示例代码的一部分,我无法翻译"迅速?这可能导致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就不会出现。必须对视图进行某种更改才能实现,无论是旋转设备还是点击另一个标签等等......

所以现在我的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!
    }

2 个答案:

答案 0 :(得分:2)

我想我弄清楚问题是什么。它与我初始化BannerViewManager类的共享实例的方式无关。事实上,无论是使用dispatch_once还是使用新的swift 2.0方式,它都会产生完全相同的行为。

在调用bannerViewDidLoadAd时导致iAd无法立即显示的事实是viewDidLayoutSubviews实际上从未被调用过!

我不得不在这里和那里添加一些打印语句。在我的代码和Apple示例代码中都可以得出这个结论。

因此setNeedsLayout而不是layoutIfNeeded强制触发viewDidLayoutSubviews

答案 1 :(得分:0)

  1. 通常,在bannerViewDidLoadAd和类似的回调函数中附加断点。
  2. 检查你是否像swift一样委托你的类YourClassViewController:UIViewController,ADBannerViewDelegate。
  3. 检查你的场景,你说"我必须旋转模拟器或转到另一个标签,以便它出现" ,那么哪种方法可能对它负责。我知道你已经猜到了。
  4. 阅读文档,分析。