Я скопировал iAdSuite with Storyboards в swift, и iAd отлично работает во всех контроллерах представлений, за исключением того, что когда метод делегата bannerViewDidLoadAd(banner: ADBannerView!)
называется видом баннера, он не отображается мгновенно. Мне нужно либо повернуть симулятор, либо перейти на другую вкладку, чтобы она появилась.iAd не отображается асинхронно после вызова метода делегата
Я думаю, что это часть образцового кода Apple в Objective-C, который я не мог «перевести» на быстрый? которые вполне могут быть причиной ОВР не показывать асинхронно после загрузки ...
+ (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)
}
}
EDIT
мне удалось преобразовать код Objective-C выше быстрым использованием this post on SO, но я до сих пор с той же проблемой. 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!
}
Я предполагаю, что у вас есть код iAd в каждом представлении контроллера 'viewDidLoad'? Если это так, переместите код iAd в каждый вид контроллера 'viewWillAppear'. –
Я сделал это полностью, как пример кода. Таким образом, в любом контроллере представления нет iAd-кода. Кроме того, в представлении контейнера есть «BannerViewController», и у меня есть эта строка 'view.addSubview (BannerViewManager.sharedInstance.bannerView)' в его 'viewWillAppear' –
@DanielStorm - Оформить образец кода для' tabbedBanner' [здесь] (https://developer.apple.com/library/ios/samplecode/iAdSuite_Storyboard/Listings/TabbedBanner_TabbedBanner_BannerViewController_m.html#//apple_ref/doc/uid/DTS40013458-TabbedBanner_TabbedBanner_BannerViewController_m-DontLinkElementID_34) –