4

複数の UITableViews を持つアプリがあり、iAD を実装中です。Apple のドキュメント ( http://developer.apple.com/library/ios/#technotes/tn2286/_index.html#//apple_ref/doc/uid/DTS40011212 ) に従って、アプリ デリゲートに属する共有バナーを作成しました。また、アプリケーション デリゲートはバナーのデリゲートでもあります。これはうまく機能し、バナーがロードされてユーザーが画面を切り替えた後、さまざまなビュー コントローラー全体で広告が適切に表示されます。

問題は、ビュー コントローラの viweWillAppear メソッド (「fixUpAdView」メソッドを呼び出す場所) がバナーが読み込まれる前に来るため、最初に表示されるビュー コントローラに広告が表示されないことです。

私が得ていない部分はこれだと思います(アップルのドキュメントから):それ。" bannerViewDidLoadAd および failToReceive メソッドに何かを入れる必要があることは理解していますが、これを行う方法について少し混乱しています。

すべてのビュー コントローラー (6 つだけ) に広告を表示したくありません。また、アプリにいくつかのモーダル ビューがあります (これらのいずれにも広告はありません)。

これが私のコードの一部です:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
    NSLog(@"bannerViewDidLoadAD");
    if (!_adBannerViewIsVisible) 
        _adBannerViewIsVisible = YES;

}


- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{

    NSLog(@"BannerAd didfailtoreceive");
    if (_adBannerViewIsVisible)
        _adBannerViewIsVisible = NO;

}

- (ADBannerView *)sharedAdBannerView 
{
    if (_sharedAdBannerView == nil) {

        Class classAdBannerView = NSClassFromString(@"ADBannerView");

        if (classAdBannerView != nil) {
            _sharedAdBannerView = [[classAdBannerView alloc] initWithFrame:CGRectZero];
            [_sharedAdBannerView setRequiredContentSizeIdentifiers:[NSSet setWithObjects: 
                                                              ADBannerContentSizeIdentifier320x50, 
                                                              ADBannerContentSizeIdentifier480x32, nil]];
            [_sharedAdBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier320x50];            
            [_sharedAdBannerView setFrame:CGRectOffset([_sharedAdBannerView frame], 0, 
                                                 -(iAD_BANNER_HEIGHT))];
            [_sharedAdBannerView setDelegate:self];
        }
    }

    return _sharedAdBannerView;
}

私のビューコントローラで:

- (void)viewWillAppear:(BOOL)animated {

    if ([[AppDelegate ad] shouldShowAds]) {

        if (!self.contentView) {
            self.contentView = [[UIView alloc] initWithFrame:[[self view] bounds]];
            [self.view addSubview:_contentView];
        }
        [self.contentView addSubview:topView];
        [self fixupAdView];
        [self.view addSubview:[[AppDelegate ad] sharedAdBannerView]];
    }
    [super viewWillAppear:NO];
}


#pragma mark
#pragma mark iADS

- (void)fixupAdView {

    if ([[AppDelegate ad] sharedAdBannerView] != nil) {        

        [[[AppDelegate ad] sharedAdBannerView] setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier320x50];
        [UIView beginAnimations:@"fixupViews" context:nil];

        if ([[AppDelegate ad] adBannerViewIsVisible]) {
            CGRect adBannerViewFrame = [[[AppDelegate ad] sharedAdBannerView] frame];
            adBannerViewFrame.origin.x = 0;
            adBannerViewFrame.origin.y = 0;
            [[[AppDelegate ad] sharedAdBannerView] setFrame:adBannerViewFrame];
            CGRect contentViewFrame = _contentView.frame;
            contentViewFrame.origin.y = iAD_BANNER_HEIGHT;
            contentViewFrame.size.height = self.view.frame.size.height - 
            iAD_BANNER_HEIGHT;
            _contentView.frame = contentViewFrame;
        } 
        else {
            CGRect adBannerViewFrame = [[[AppDelegate ad] sharedAdBannerView] frame];
            adBannerViewFrame.origin.x = 0;
            adBannerViewFrame.origin.y = -(iAD_BANNER_HEIGHT);
            [[[AppDelegate ad] sharedAdBannerView] setFrame:adBannerViewFrame];
            CGRect contentViewFrame = _contentView.frame;
            contentViewFrame.origin.y = 0;
            contentViewFrame.size.height = self.view.frame.size.height;
            _contentView.frame = contentViewFrame;            
        }
        [UIView commitAnimations];
    }   
}
4

2 に答える 2

6

この問題を解決するために NSNotificationCenter を使用することは魅力的に機能し、iAds が読み込まれるとすぐに表示されるようになりました。他の誰かがこれを必要とする場合、ここに私が入力した追加のコードがあります: (私の appDelegate.m 内)

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
NSLog(@"bannerViewDidLoadAD");
if (!_adBannerViewIsVisible) {
    _adBannerViewIsVisible = YES;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
}

}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error

{

 NSLog(@"BannerAd didfailtoreceive");
if (_adBannerViewIsVisible) {
    _adBannerViewIsVisible = NO;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
}

}

および私のView Controller(viewWillAppear内)で:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(fixupAdView)
                                                 name:@"adjustAdBannerView"
                                               object:nil];
于 2012-05-03T15:34:56.247 に答える
0

私はこれに苦労してきましたが、これと他の多くの回答は非常に役に立ちました。ただし、それらはすべて、AppDelegate と対話する someViewController.m コードを中継しているように見えますが、これは間違った方法のようです。

私の解決策は、次のように App Delegate に adBannerView オブジェクトを subViewControllers に渡すことです。

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    if (VERBOSE) NSLog(@"sharedAdBannerView %@ failed with error: %@", banner, error);
    if (self.adBannerIsVisible)
    {
        [someViewController setAdBannerViewIsVisible:NO];
        [someViewController setAdBannerView:nil];
        [otherViewController setAdBannerViewIsVisible:NO];
        [otherViewController setAdBannerView:nil];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
    }
}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    if (VERBOSE) NSLog(@"sharedAdBannerView %@ loaded", banner);
    if (!self.adBannerIsVisible)
    {
        [someViewController setAdBannerViewIsVisible:YES];
        [someViewController setAdBannerView:sharedAdBannerView];
        [otherViewController setAdBannerViewIsVisible:YES];
        [otherViewController setAdBannerView:sharedAdBannerView];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
    }
}

次に、オブジェクトをsomeViewController表示またはビューから削除するコードを含めることができます。adBannerView

複数の異なるビューで同じ AdBannerView を使用すると問題が発生しますか?

于 2014-05-14T15:45:02.337 に答える