Ich habe die iAdSuite with Storyboards in Swift repliziert, und die iAd funktioniert über alle View-Controller ordnungsgemäß, außer, wenn die Delegate-Methode bannerViewDidLoadAd(banner: ADBannerView!)
aufgerufen wird, wird die Banneransicht nicht sofort angezeigt. Ich muss entweder den Simulator drehen oder zu einem anderen Tab gehen, damit er erscheint.iAd wird nicht asynchron angezeigt, sobald seine Delegate-Methode aufgerufen wird
Ich denke, das der Teil des Apple-Beispielcode in Objective-C ist, dass ich nicht zu swift „übersetzen“ könnte? die gut verursachen können die iAd zeigen nicht asynchron einmal geladen ...
+ (BannerViewManager *)sharedInstance
{
static BannerViewManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[BannerViewManager alloc] init];
});
return sharedInstance;
}
Das ist mein BannerViewManager
Klasse mit den ADBannerViewDelegate
Methoden.
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
Ich habe es geschafft, die Objective-C-Code über rasche this post on SO zu konvertieren, aber ich habe immer noch das gleiche Problem mit. Das iAd erscheint nicht sobald es geladen ist. Es muss eine Art von Veränderung so zu der Ansicht sein, dass es der Fall ist, entweder Drehvorrichtung oder ein anderes Register tippen, etc ...
So jetzt meine sharedInstance
wie folgt aussieht:
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!
}
Ich nehme an, Sie in jeder Ansicht Controller 'viewDidLoad' einige iAd-Code? Wenn dies der Fall ist, verschieben Sie den iAd-Code in den ViewWillAppear jedes View-Controllers. –
Ich habe das den ganzen Weg wie der Beispielcode getan. Es gibt also keinen iAd-Code in einem View-Controller. Alternativ gibt es ein 'BannerViewController' in einem Container Ansicht ist, und ich habe diese Linie bekommt' view.addSubview (BannerViewManager.sharedInstance.bannerView) 'in seinem' viewWillAppear' –
@DanielStorm - Kasse den Beispielcode für 'tabbedBanner' [hier] (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) –