Insérer une bannière pub dans un TableViewController

Le but est d’insérer une bannière publicitaire AdWhirl fixe en bas d’un TabViewController : la vue tabViewController reste “scrolable” sous la bannière publicitaire.

Il y a donc un Application Delegate MyAppDelegate pour initialiser l’appli et positionner le Navigation Controller.

Pour le TableViewController, le meilleur moyen d’insérer une bannière pub est d’implémenter un UIViewController MyViewController qui gère la vue dans laquelle il y a la bannière et le table view.

Il faut également créer les fichiers xib associés : MainWindow.xib et MyViewController.xib

Préalable : avoir ajouté le code nécessaire pour AdWhirl dans votre application, pour cela suivez les instructions AdWhirl.

Le code du delegate de l’application :

MyAppDelegate.h :

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {

        UIWindow *window;
	UINavigationController *navController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navController;

@end

MyAppDelegate.m :


#import "MatafAppDelegate.h"
#import "AnalysesController.h"
#import "PushAndConnection.h"
#import "XMLToObjectParser.h"
#import "Parites.h"

@implementation MatafAppDelegate

@synthesize window;
@synthesize navController;
@synthesize registered;
@synthesize token;
@synthesize parityPushOn;


#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)opts {  
		// Override point for customization after app launch
	[window addSubview:navController.view];
	[window makeKeyAndVisible];
	
	return YES;
}

#pragma mark -
#pragma mark Memory management
- (void)dealloc {
	[window release];
	[navController release];
	[super dealloc];
}

Le code du controller qui va gérer la “TableView” et la bannière pub :

MyViewController.h :

#import <UIKit/UIKit.h>
#import "AdWhirlDelegateProtocol.h"

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, AdWhirlDelegate> {
	NSArray *controllers;
	UITableView *mytableView;
	UIView *mycontentView;
	
	/* pour adWhirl PUB */
	AdWhirlView *adView;
}

@property (nonatomic, retain)NSArray *controllers;
@property (nonatomic, retain) IBOutlet UITableView *mytableView;
@property (nonatomic, retain) IBOutlet UIView *mycontentView;

@property (nonatomic, retain) AdWhirlView *adView;

//pour voir si une connexion internet est dispo
-(BOOL)isDataSourceAvailable;

@end

MyViewController.m :


#import <SystemConfiguration/SystemConfiguration.h>
#import "MatafAppDelegate.h"
#import "FirstLevelViewController.h"
#import "SecondLevelViewController.h"
#import "AnalysesController.h"
#import "NewsController.h"
#import "GraphsController.h"
#import "ToolsController.h"

#import "AdWhirlView.h"
#import "adWhirlConstants.h"

@implementation FirstLevelViewController
@synthesize controllers, mytableView, mycontentView;
@synthesize adView;

#pragma mark Gestion banière pub

- (void)createAdBannerView {
	/*pour adWhirl PUB */
	self.adView = [AdWhirlView requestAdWhirlViewWithDelegate:self];
	self.adView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin;
	NSString *curDevice = [[UIDevice currentDevice] name];
	NSLog(@"current device is %@",curDevice);
	NSRange range = [curDevice rangeOfString:@"iPad"];
	if(range.location != NSNotFound) {
		NSLog(@"iPad");
		self.adView.frame = CGRectMake(220, 950, 320, 50);
	} else {
		self.adView.frame = CGRectMake(0, 367, 320, 50);
	}
	
	[self.view addSubview:self.adView];
}


#pragma mark Initialization
- (void)viewDidLoad {
	
	self.title = @"MyApp";
		//tableau pour ranger tous les controllers
	/* initialisation parites */
	NSArray *array = [[NSArray alloc] initWithObjects:@"riri",@"fifi",@"loulou",nil];
	self.controllers = array;
	[array release];
	
	[self createAdBannerView];
	[super viewDidLoad];
}

- (void)viewDidUnload {
	self.controllers = nil;
	self.mytableView = nil;
	self.mycontentView = nil;
	[super viewDidUnload];
}

- (void)dealloc {
	[controllers release];
	[mytableView release];
	[mycontentView release];
	[super dealloc];
}


#pragma mark -
#pragma mark Table data Source Methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

/* nom de la methode : tableView:numberOfRowsInSection
 * return : NSInteger
 * arg1 = (UITableView*)tableView
 * arg2 = (NSInteger) section
 */
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {
	return [self.controllers count];
}


/* nom de la methode : tableView:cellForRowAtIndexPath (cellForRowAtIndexPath est une étiquette)
 * return : (UITableViewCell *)
 * arg1 = (UITableView*)tableView
 * arg2 = (NSIndexPath *)indexPath
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	static NSString	*FirstLevelCell = @"FirstLevelCell";
	
	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:FirstLevelCell];
	if(cell == nil) {
		cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:FirstLevelCell] autorelease];
	}
	
		//configure the cell
	NSUInteger row = [indexPath row];
	cell.textLabel.text = [controllers objectAtIndex:row];
	NSLog(@"controller.title=%@",controller.title);
	cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
	
	return cell;
}

#pragma mark -
#pragma mark Table View Delegate Methods
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
	/* do whatever you want when user clic on a line of the TableView */
}

#pragma mark AdWhirlDelegate methods
- (NSString *)adWhirlApplicationKey {
	return ADWHIRLAPPKEY;
}

- (UIViewController *)viewControllerForPresentingModalView {
	return [((MatafAppDelegate *)[[UIApplication sharedApplication] delegate]) navController];
}

Pour les fichiers xib:

  • MainWindow.xib : ajouter un Navigation Controller et “control drag” de MyAppDelegate vers ce navigation controller pour lui associer l’Outlet navController défini dans le delegate.
    Dans ce NavigationContrller, la classe de la View doit être positionnée à MyViewController
  • MyViewController.xib : ajouter un objet View. Dans cet objet View, ajouter un objet View puis dans ce 2ème objet View, ajouter un objet TableView. Connecter les outlet : myContentView avec la 2ème View, mytableView avec le TableView et la 1ère View avec la View du file’s owner. N’oublier pas de connecter DataSource et Delegate du TableView au File’s Owner

Je n’aurai pas pu écrire ce tutoriel sans avoir lu celui-ci qui explique comment ajouter une bannière iAd dans un TableViewController. Merci à l’auteur !

This entry was posted in iPhone, tutoriels and tagged , , , . Bookmark the permalink.