我已经在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!
}
答案 0 :(得分:2)
我想我弄清楚问题是什么。它与我初始化BannerViewManager
类的共享实例的方式无关。事实上,无论是使用dispatch_once
还是使用新的swift 2.0方式,它都会产生完全相同的行为。
在调用bannerViewDidLoadAd
时导致iAd无法立即显示的事实是viewDidLayoutSubviews
实际上从未被调用过!
我不得不在这里和那里添加一些打印语句。在我的代码和Apple示例代码中都可以得出这个结论。
因此setNeedsLayout
而不是layoutIfNeeded
强制触发viewDidLayoutSubviews
答案 1 :(得分:0)