2012-03-14 62 views
6

我想在我的應用程序中使用AdMob,並且我有4個viewControllers(4個選項卡項),我想讓它可見。示例顯示的方式,每個ViewController需要創建它的實例並添加爲子視圖。AdMod所有ViewControllers中的單個實例

我還在想,如果有可能只能使用1個可用於所有應用程序的實例。我怎樣才能做到這一點?

如果我在AppDelegate中創建1個實例作爲autorelease,並保留在每個viewController中,並在viewDidUnload釋放它,然後在下一個選項卡項(viewController)我再次保留它等等...是好辦法嗎?

回答

2

AppDelegate aproach是一個不錯的方法,但您不應該在每個viewcontroller中保留admob的實例,並在viewDidUnload方法中釋放相同的內容。不要這樣做,只需在每個視圖控制器的viewDidLoad方法中將admob的視圖添加爲子視圖。以這種方式,AppDelegate中只有一個Admob視圖實例。

希望這可以幫助你。

+0

您不能將一個視圖作爲子視圖添加到多個視圖。 – beryllium 2012-03-14 10:11:12

3

您可以在appDelegate中聲明您的admob視圖並將其作爲子視圖添加到窗口中。請參考通過appDelegate從VC的admob視圖

7

當然,這是行得通的,但唯一的問題是,當您更新廣告委託時,它不會真正爲廣告選取新委託,除非您明確地製作新廣告廣告請求,因此您的舊視圖將會收到來自廣告的任何通知。我建議製作一個adMob單身人員的方法,然後將任何委託通知轉發到正確的視圖。

所以創建一個名爲GADMasterViewController類(確保它遵循GADBannerViewDelegate協議太)或一些東西,有一個靜態初始化像這樣:

+(GADMasterViewController *)singleton { 
    static dispatch_once_t pred; 
    static GADMasterViewController *shared = nil; 
    dispatch_once(&pred, ^{ 
    shared = [[GADMasterViewController alloc] init]; 
    }); 
    return shared; 
} 

然後在初始化可以初始化一個單一的GADBannerView作爲屬性此單的:

-(id)init 
{ 
    if (self = [super init]) 
    { 
    self.adBanner = [[GADBannerView alloc] 
        initWithFrame:CGRectMake(0.0, 
               0.0, 
               GAD_SIZE_320x50.width, 
               GAD_SIZE_320x50.height)]; 

    // Has an ad request already been made 
    self.isLoaded = NO; 
    } 
    return self; 
} 

然後你就可以擁有這臺新的AdView作爲currentDelegate作爲這樣的方法:

-(void)resetAdView:(UIViewController<GADBannerViewDelegate> *)rootViewController { 

    if (self.isLoaded) { 
    currentDelegate_ = rootViewController; 
    [rootViewController.view addSubview:self.adBanner]; 
    } 
    else { 
    // The delegate to forward any notifications too 
    currentDelegate_ = rootViewController; 

    self.adBanner.delegate = self; 
    self.adBanner.rootViewController = rootViewController; 
    self.adBanner.adUnitID = kSampleAdUnitID; 

    GADRequest *request = [GADRequest request]; 

    [self.adBanner loadRequest:request]; 
    [rootViewController.view addSubview:self.adBanner]; 
    self.isLoaded = YES; 
    } 
} 

在這一點上,你只想着你獲得正確的viewController任何通知,所以一個例子是:

- (void)adViewDidReceiveAd:(GADBannerView *)view { 
    if ([currentDelegate_ respondsToSelector:@selector(adViewDidReceiveAd:)]) { 
    [currentDelegate_ adViewDidReceiveAd:view]; 
    } 
} 

ViewControllerX(一個你4個ViewControllers的),你可以只將其添加到您的視圖層次使用:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    shared = [GADMasterViewController singleton]; 
    [shared resetAdView:self]; 
} 
+0

謝謝大家。 – Anand 2012-03-15 10:52:57

+3

謝謝你,拉傑,很好的答案。對於閱讀此內容的所有人,您還可以閱讀http://googleadsdeveloper.blogspot.co.il/2012/04/creating-gadbannerview-singleton-in.html – kernix 2012-09-21 12:00:54

相關問題