2015-12-21 19 views
8

Tôi đã sao chép iAdSuite with Storyboards nhanh chóng và iAd hoạt động tốt trên tất cả các trình điều khiển chế độ xem, ngoại trừ khi phương thức ủy nhiệm bannerViewDidLoadAd(banner: ADBannerView!) được gọi là chế độ xem biểu ngữ không xuất hiện ngay lập tức. Tôi phải quay mô phỏng hoặc chuyển sang tab khác để nó xuất hiện.iAd không hiển thị không đồng bộ khi phương thức ủy nhiệm của nó được gọi là

Tôi nghĩ rằng đây là một phần của mã mẫu Apple trong Mục tiêu-C mà tôi không thể "dịch" sang nhanh? mà cũng có thể gây ra iAd không hiển thị không đồng bộ một lần nạp ...

+ (BannerViewManager *)sharedInstance 
{ 
    static BannerViewManager *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[BannerViewManager alloc] init]; 
    }); 
    return sharedInstance; 
} 

Đây là lớp BannerViewManager tôi với ADBannerViewDelegate phương pháp.

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

tôi đã được quản lý để chuyển đổi mã Objective-C trên để nhanh chóng sử dụng this post on SO nhưng tôi vẫn có cùng một vấn đề. IAd không xuất hiện sau khi được tải. Có là đã nhận được một số loại thay đổi quan điểm nữa kẻo nó, hoặc xoay thiết bị hoặc khai thác tab khác, vv ...

Vì vậy bây giờ tôi sharedInstance trông như thế này:

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! 
    } 
+1

Tôi giả định rằng bạn có một số mã iAd trong 'viewDidLoad' của bộ điều khiển chế độ xem? Nếu vậy, hãy di chuyển mã iAd tới 'viewWillAppear' của mỗi bộ điều khiển xem. –

+1

Tôi đã làm điều này tất cả các cách như mã mẫu. Vì vậy, không có mã iAd trong bất kỳ trình điều khiển chế độ xem nào. Ngoài ra có một 'BannerViewController' trong một khung nhìn container và tôi đã có dòng này' view.addSubview (BannerViewManager.sharedInstance.bannerView) 'trong' viewWillAppear' –

+0

@DanielStorm - Kiểm tra mã mẫu của 'tabbedBanner' [ở đây] (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) –

Trả lời

2

Tôi nghĩ tôi đã tìm ra vấn đề là gì. Nó không liên quan gì đến cách tôi khởi tạo phiên bản được chia sẻ của lớp BannerViewManager. Trong thực tế, nó bật ra để cung cấp cho chính xác cùng một hành vi cho dù sử dụng dispatch_once hoặc cách nhanh chóng 2.0 mới.

Điều khiến iAd không hiển thị ngay lập tức khi bannerViewDidLoadAd được gọi là viewDidLayoutSubviews thực sự không bao giờ được gọi!

Tôi phải thêm một số câu lệnh in ở đây và ở đó. Cả hai trong mã của tôi và mã mẫu của Apple để đạt được kết luận này.

Vì vậy, thay vì setNeedsLayoutlayoutIfNeeded buộc kích hoạt các viewDidLayoutSubviews

0
  1. Nói chung, đính kèm các breakpoint trong bannerViewDidLoadAd, và hàm callback tương tự.
  2. Kiểm tra bạn có đại biểu như trong nhanh như lớp YourClassViewController: UIViewController, ADBannerViewDelegate.
  3. Kiểm tra kịch bản của bạn, bạn đã nói "Tôi phải xoay trình mô phỏng hoặc chuyển đến tab khác để nó xuất hiện", vì vậy phương thức nào có thể chịu trách nhiệm về nó. Tôi biết bạn đã đoán nó.
  4. Đọc tài liệu, phân tích.
Các vấn đề liên quan