Ho replicato lo iAdSuite with Storyboards in rapido e l'iAd funziona perfettamente su tutti i controller di visualizzazione, tranne che quando il metodo delegato bannerViewDidLoadAd(banner: ADBannerView!)
viene chiamato la visualizzazione banner non viene visualizzata all'istante. Devo ruotare il simulatore o andare in un'altra scheda in modo che appaia.iAd non viene visualizzato in modo asincrono una volta chiamato il suo metodo delegato
Penso che questa sia la parte del codice di esempio Apple in Objective-C che non potevo "tradurre" in swift? che potrebbe essere la causa del iAd non mostra in modo asincrono una volta caricato ...
+ (BannerViewManager *)sharedInstance
{
static BannerViewManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[BannerViewManager alloc] init];
});
return sharedInstance;
}
Questa è la mia classe BannerViewManager
con i ADBannerViewDelegate
metodi.
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
sono riuscito a convertire il codice Objective-C al di sopra di rapida utilizzando this post on SO ma ho ancora lo stesso problema. L'iAd non appare una volta caricato. Ci deve essere una sorta di cambiamento per la vista in modo che lo fa, o dispositivo rotante o toccando un'altra scheda, ecc ...
Così ora il mio sharedInstance
assomiglia a questo:
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!
}
Suppongo che tu abbia del codice iAd in 'viewDidLoad' di ciascun controller? In tal caso, sposta il codice iAd in 'viewWillAppear 'di ogni view. –
L'ho fatto fino in fondo come il codice di esempio. Quindi non esiste un codice iAd in nessun controller di visualizzazione. In alternativa c'è un 'BannerViewController' in una vista container e ho questa riga' view.addSubview (BannerViewManager.sharedInstance.bannerView) 'nel suo' viewWillAppear' –
@DanielStorm - Controlla il codice di esempio per 'tabbedBanner' [qui] (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) –