Agregue banner iAd en UItableView con storyboard

No logro que iAd funcione en storyboard, dentro de un UITableViewController.

Esto es básicamente lo que he hecho hasta ahora: en el guión gráfico, he arrastrado una vista de banner iAd en la parte inferior de la escena de mi UITableViewController. (No pude configurar el banner en la vista misma como el storyboard lo impide. Solo pude arrastrar el object iAd al lado del primer respondedor y los icons de UITableViewController).

En el encabezado del UITAbleViewController, tengo:

#import <UIKit/UIKit.h> #import "ListViewController.h" #import <iAd/iAd.h> @interface ListViewController : UITableViewController <ADBannerViewDelegate>{ bool bannerIsVisible; } @property (strong, nonatomic) IBOutlet ADBannerView *iAd; @end 

En la implementación del UITableViewController, tengo:

 - (void)viewDidLoad { [super viewDidLoad]; iAd.delegate = self; // iAd.frame = CGRectMake(0.0,200.0,iAd.frame.size.width,iAd.frame.size.height); // does not work // self.tableView.tableFooterView = iAd; // Display the banner at the middle of the screen (depending upon the number item of the table) // Do not know how to have the default banner to appear at the very bottom of the screen (behind the tab bar) when the view is loaded ? } - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error { NSLog(@"didFailToReceiveAdWithError"); if (bannerIsVisible) { [UIView beginAnimations:@"animateAdBannerOff" context:NULL]; banner.frame = CGRectMake(0.0,350.0,banner.frame.size.width,banner.frame.size.height); [UIView commitAnimations]; bannerIsVisible = NO; } } - (void)bannerViewDidLoadAd:(ADBannerView *)banner { NSLog(@"bannerViewDidLoadAd"); if (!bannerIsVisible) { [UIView beginAnimations:@"animateAdBannerOn" context:NULL]; banner.frame = CGRectMake(0.0,317.0,banner.frame.size.width,banner.frame.size.height); [UIView commitAnimations]; bannerIsVisible = YES; } } 

La idea es hacer que el banner aparezca en la parte inferior de la pantalla y mostrarlo encima de la barra de tabs es la carga del banner exitosa.

El problema que tengo: con esta configuration puedo ver que a veces se llama al método "didFailToReceiveAdWithError" ya veces al "bannerViewDidLoadAd", pero en cada caso el banner no se muestra.

Su problema es común. No está sucediendo debido a storyboard, sino que está sucediendo debido al hecho de que está utilizando un UITableViewController . UITableViewControllers te ofrece mucho de forma gratuita, pero sí requieren algunas cosas. Una de esas "cosas" es que exigen que su opinión sea una UITableView .

Tienes pocas opciones. Aquí hay algunos de los preferidos.

1) Agregue su iAd como tableFooterView . Esto requiere un trabajo adicional para mantenerlo en la pantalla mientras se desplaza hacia afuera alineado en mi respuesta a esta pregunta .

2) Convierta su subclass UITableViewController para que sea una subclass UIViewController . Esto es curiosamente lo que acabó haciendo el OP de la pregunta vinculada anteriormente. Esencialmente, puede animar el marco de tableView (ahora una subvista) mientras anima el iAd. Y luego funcionará como se esperaba. UIViewController los pasos básicos para convertir a una subclass UIViewController en un file .xib en esta respuesta , la mayor parte debería serle aplicable.

Sé que soy demasiado tarde para la respuesta, pero para las personas que podrían visitar este hilo para get una respuesta. esto podría ayudarlos

en el file del encabezado

 #import <UIKit/UIKit.h> #import "ListViewController.h" #import <iAd/iAd.h> @interface ListViewController : UITableViewController <ADBannerViewDelegate> @property (nonatomic, strong) ADBannerView *bannerForTableFooter; @property (nonatomic) BOOL bannershouldBeVisible; @end 

en el file .m

 -(ADBannerView *)bannerForTableFooter { if (!_bannerForTableFooter) { _bannerForTableFooter = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner]; _bannerForTableFooter.delegate = self; } return _bannerForTableFooter; } 

en ViewDidLoad

 self.bannerForTableFooter.backgroundColor = [UIColor clearColor]; 

y luego agregue estos methods de fuente de datos tableView

 -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { if (self.bannershouldBeVisible) { return self.bannerForTableFooter.frame.size.height; } else { return 0; } } -(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { if (self.bannershouldBeVisible) { return self.bannerForTableFooter; } else { return [[UIView alloc] initWithFrame:CGRectZero]; } } #pragma mark - iAd -(void)bannerViewDidLoadAd:(ADBannerView *)bannerShown { self.bannershouldBeVisible = YES; [self.tableView reloadData]; } -(void)bannerView:(ADBannerView *)bannerShown didFailToReceiveAdWithError:(NSError *)error { self.bannershouldBeVisible = NO; [self.tableView reloadData]; } 

Hay una mejor manera Desde aquí: https://github.com/romaonthego/RETableViewManager/issues/50

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGRect frame = self.iAd.frame; frame.origin.y = scrollView.contentOffset.y + scrollView.frame.size.height-_iAd.frame.size.height; // Move view to the bottom on scroll self.iAd.frame = frame; [scrollView bringSubviewToFront:self.iAd]; } 

Actualizaciones Hay una mejor manera de mostrar el banner iAd en la parte inferior desde iOS7 .

 - (void)viewDidLoad { [super viewDidLoad]; self.canDisplayBannerAds = YES; ... } 

Desde iOS 7 en adelante, no se necesita ninguna de estas cosas. Todo lo que tiene que hacer, como @Shmidt implicó en su comentario, se establece self.canDisplayBannerAds = true en su viewDidLoad y todo lo demás se maneja automáticamente. Esto funciona muy bien con las vistas de tabla también.