Ios AdMod所有ViewController中的单个实例

Ios AdMod所有ViewController中的单个实例,ios,objective-c,iphone,admob,Ios,Objective C,Iphone,Admob,我想在我的应用程序中使用AdMob,我有4个ViewController(在4个选项卡项中),我想让它可见。按照示例显示的方式,每个ViewController都需要创建其实例并添加为子视图 我仍然在想,是否有办法只使用一个实例,可以在所有应用程序中使用。我该怎么做 如果我在AppDelegate中创建一个实例作为自动释放,并在每个viewController中保留,然后在viewDidUnload上释放它,然后在下一个选项卡项(viewController)中释放它我再次保留它等等……这是一种

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

我仍然在想,是否有办法只使用一个实例,可以在所有应用程序中使用。我该怎么做


如果我在AppDelegate中创建一个实例作为自动释放,并在每个viewController中保留,然后在viewDidUnload上释放它,然后在下一个选项卡项(viewController)中释放它我再次保留它等等……这是一种好方法吗?

AppDelegate aproach是一种很好的方法,但您不应该在每个viewcontroller中保留admob的实例,并在
viewDidUnload
方法中释放相同的实例。不要这样做,只需将admob的视图作为子视图添加到每个viewcontroller的
viewdiload
方法中即可。以这种方式,AppDelegate中只有一个Admob视图实例


希望这对您有所帮助。

您可以在appDelegate中声明admob视图,并将其作为子视图添加到窗口中。从VC通过appDelegate参考admob视图当然可以,但唯一的问题是,当您更新ad的代理时,除非您明确提出新的ad请求,否则它实际上不会拾取ad的新代理,因此,您的旧视图将收到来自广告的任何通知。我建议您采用制作adMob singleton的方法,然后将任何代理通知转发到正确的视图

因此,创建一个名为
GADMasterViewController
的类(确保它也遵循
GadBanerViewDelegate
协议)或具有静态初始值设定项的类:

+(GADMasterViewController *)singleton {
  static dispatch_once_t pred;
  static GADMasterViewController *shared = nil;
  dispatch_once(&pred, ^{
    shared = [[GADMasterViewController alloc] init];
  });
  return shared;
}
然后,在初始值设定项中,可以将单个GadBanerView初始化为此单例的属性:

-(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;
  }
}
ViewControllerX
(4个ViewControllerX之一)中,您可以使用以下方法将其添加到视图层次结构中:

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

您不能将一个视图作为子视图添加到多个视图中。谢谢您,Raj,这是一个很好的答案。对于每一个读到这篇文章的人,你也可以阅读
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    shared = [GADMasterViewController singleton];
    [shared resetAdView:self];
}