Powtórzyłem wersję iAdSuite with Storyboards w trybie szybkim, a program iD działa poprawnie na wszystkich kontrolerach widoku, z tym że po wywołaniu metody delegowania bannerViewDidLoadAd(banner: ADBannerView!)
widok banera nie pojawia się natychmiast. Muszę albo obrócić symulator, albo przejść do innej zakładki, żeby się pojawiła.Funkcja iAd nie jest wyświetlana asynchronicznie, gdy jej metoda delegata nazywa się
myślę, że to jest część Apple przykładowy kod w Objective-C, że nie mogę „przetłumaczyć” SWIFT? co może być przyczyną dobrze iAd nie pokazują asynchronicznie po załadowaniu ...
+ (BannerViewManager *)sharedInstance
{
static BannerViewManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[BannerViewManager alloc] init];
});
return sharedInstance;
}
To mój BannerViewManager
klasa z metodami 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
udało mi się przekształcić kod Objective-C powyżej szybkich wykorzystaniem this post on SO ale nadal mam ten sam problem. IAd nie pojawia się po załadowaniu. Musi być jakieś zmiany do widoku tak, że to robi, albo urządzenie obraca lub dotykając inną kartę, itd ...
Więc teraz moje sharedInstance
wygląda następująco:
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!
}
Ja zakładając, że masz jakiś kod IAD w każdy kontroler widoku za 'viewDidLoad'? Jeśli tak, przenieś kod iAd do "viewWillAppear" każdego kontrolera widoku. –
Zrobiłem to tak jak kod przykładowy. Tak więc nie ma kodu iAd w żadnym kontrolerze widoku. Alternatywnie istnieje 'BannerViewController' w widoku kontenera i mam ten wiersz' view.addSubview (BannerViewManager.sharedInstance.bannerView) 'w' viewWillAppear' –
@DanielStorm - kasy przykładowy kod dla 'tabbedBanner' [tutaj] (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) –