2012-03-14 6 views
6

Deseo utilizar AdMob en mi aplicación y tengo 4 viewControllers (en elementos de 4 pestañas) donde deseo que sea visible. La forma en que muestra la muestra, cada ViewController necesita hacer una instancia y agregar como subvista.AdMod instancia única en todos los ViewControllers

Todavía estoy pensando si puede haber alguna forma de usar solo 1 instancia que pueda usarse en todas las aplicaciones. ¿Cómo puedo hacer eso?

Si creo 1 instancia en AppDelegate como liberación automática y la conservo en cada viewController y en viewDidUnload suéltala y luego en el elemento de la pestaña siguiente (viewController) la vuelvo a conservar, etc. ¿es un buen enfoque?

Respuesta

2

El enfoque de AppDelegate es un enfoque agradable, pero no debe retener la instancia del admob en cada controlador de vista y liberarlo en el método viewDidUnload. En lugar de hacer esto, simplemente agregue la vista del admob en el método viewDidLoad de cada viewcontroller como una subvista. De esta manera, solo habrá una instancia de la vista del AdMob en AppDelegate.

Espero que esto te ayude.

+0

No puede agregar una vista como subvista a varias vistas. – beryllium

3

Puede declarar su vista de admob en appDelegate y agregarla como subvista a la ventana. Consulte admob view from VC a través de appDelegate

7

Claro, eso funcionaría pero el único problema es que cuando actualiza el delegado para el anuncio, no recogerá al nuevo delegado para el anuncio a menos que haga un nuevo solicitud de anuncio, por lo que sus vistas anteriores recibirán notificaciones del anuncio. Recomiendo el enfoque de hacer un singleton de AdMob que luego envíe las notificaciones de delegados a la vista correcta.

lo tanto la creación de una clase llamada GADMasterViewController (asegúrese de que sigue el protocolo GADBannerViewDelegate también) o algo que tiene un inicializador estático como tan:

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

Luego, en el inicializador puede inicializar una sola GADBannerView como una propiedad de este producto único:

-(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; 
} 

, entonces puede tener un procedimiento que establecerá la nueva adView como el currentDelegate como tal:

-(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; 
    } 
} 

En este punto, lo que desea reenviar las comunicaciones que se llega a la viewController derecha, por lo que un ejemplo sería:

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

En ViewControllerX (uno de sus 4 ViewControllers), que sólo podría agréguelo a su jerarquía de vistas utilizando:

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

Gracias a todos. – Anand

+3

Gracias, Raj, por la gran respuesta. Para todos los que lean esto, también pueden leer http://googleadsdeveloper.blogspot.co.il/2012/04/creating-gadbannerview-singleton-in.html – kernix

Cuestiones relacionadas