2014年4月18日金曜日

Googleの広告デリゲートを別クラスにするには

Gooleの広告(AdMob)のデリゲートをrootViewControllerなんかにいれちゃうと、どうもソースコードがコテコテに油っこくなっちゃいます。

なので、adMob.delegate = selfってやつを、adMob.delegate = adViewController (そう、AdMobの場合、デリゲート先はViewController限定なのでした)なんてすると、どうもハングアップしてしまいます。

しかたないのでrootViewControllerにながながとAdMobのコードを入れ込みましたが、どうも気持ち悪い。


で、rootViewControllerで、どうにかしてadViewControllerを生成してなんとかならないか、いろいろググっても出てこない・・・

いろいろと試した結果、こんな感じで成功しました。

1.FileでViewControllerとしてAdViewController.h/.mを作っておく。

2.ストーリーボードでAdViewControllerをViewController部品をドラックしてきて作る。
 大きさはSizeをFreeformにして、320x50に指定(指定しても関係ないっぽいですが)。
 クラスはAdViewControllerにしておく。
 Storyboard内で繋げないので、Storyboard ID に"adViewController"とか名前をつけておく。

3.rootViewController内でStoryboard内のAdViewControllerのインスタンスを生成しAddViewする。
Storyboard内にAdViewControllerが定義済みなので、そいつを[self.storyboard instantiateViewControllerWithIdentifier:@"adViewController”];でインスタンス化してあげる。
ここがキモでした。

その上で、presentViewController「ではなく」、adViewControllerのビューをaddSubviewしてあげるのです。

#import "AdViewController.h"

@interface rootViewController ()
@property (nonatomic,strong) AdViewController * adVC;
@end

@implementation rootViewController

- (void)viewDidLoad {
[super viewDidLoad];
        
    _adVC = [self.storyboard instantiateViewControllerWithIdentifier:@"adViewController"];
    [self.view addSubview:_adVC.view];

@end

4.最後にAdViewControllerのviewDidLoad内に、self.viewのCGRectで、rootViewController内のView上の位置や、self.view内のAdMobのビューの位置を指定してあげたり、デリゲートをselfにしていろいろ書いてあげたりする。つまりAdMobの処理はAdViewController内に「全て」記載してあげればいい。それだけ。

いやぁ、悩みましたよ。それだけ。はい。

0 件のコメント:

コメントを投稿