所有ViewController中的AdMod单一实例

我想在我的应用程序中使用AdMob,我有4个viewControllers(在4个选项卡项),我想使其可见。 示例显示的方式,每个ViewController都需要创build它的实例并添加为子视图。

我仍然在想,如果有可能只使用一个可以在所有应用程序中使用的实例。 我怎样才能做到这一点?

如果我在AppDelegate中创build1个实例作为autorelease并保留在每个viewController和viewDidUnload释放它,然后在下一个选项卡项目(viewController)我再次保留它等…是好办法?

AppDelegate aproach是一个不错的方法,但是你不应该在每个viewcontroller中保留admob的实例,并且在viewDidUnload方法中释放它。 而不是这样做,只需在每个viewcontroller的viewDidLoad方法中添加admob的视图作为子视图。 以这种方式,在AppDelegate中只有一个Admob视图的实例。

希望这可以帮助你。

当然,这是可行的,但唯一的问题是,当您更新广告的委托时,除非您明确提出新的广告请求,否则实际上不会为广告选取新的委托,所以您的旧视图将会收到任何通知来自广告。 我build议制作一个adMob单身的方法,然后将任何委托通知转发到正确的视图。

所以创build一个名为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个ViewController之一)中,你可以使用下面的代码将它添加到你的视图层次结构中:

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

您可以在appDelegate中声明您的admob视图,并将其作为子视图添加到窗口中。 通过appDelegate参考VC中的admob视图