2

UITableViews を使用してアプリ全体で ADBannerView の共有インスタンスを使用 する 多くのビュー コントローラーで iAd バナーの単一の共有インスタンスを作成する方法は? rootviewcontroller を含む複数のビューで共有される AdBannerView はどのように?

didFinishLoading メソッドの AppDelegate クラスにロードされる単一の ADBannerView が必要です。この ADBannerView は、(AppDelegate.h をインポートすることによって) 関連するすべての ViewController によって取得され、ユーザーが VC 間を移動したときにそれに応じて表示されることが期待されます。

私が実装したコードは次のとおりです。

AppDelegate.h @interface AppDelegate : UIResponder

@property (strong, nonatomic) IBOutlet ADBannerView *adView;
@property (nonatomic, assign) BOOL bannerIsVisible;

- (ADBannerView *)sharedAdBannerView;

AppDelegate.m

ADBannerView *adView;
BOOL bannerIsVisible;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions
{   
    // create the iAdBannerView
    adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
    adView.frame = CGRectOffset(adView.frame, 0, -50);
    adView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifier320x50];
    adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50;
    adView.delegate=self;
    self.bannerIsVisible=NO;

    // Override point for customization after application launch.
    return YES;
}

#pragma begin of iAdBannerView Delegate Methods
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{

    if (self.bannerIsVisible)
    {
        [UIView beginAnimations:@"animateAdBannerOff" context:NULL];
        banner.frame = CGRectOffset(banner.frame, 0, -50);
        [UIView commitAnimations];
        self.bannerIsVisible = NO;
    }

}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{

    if (!self.bannerIsVisible)
    {
    [UIView beginAnimations:@"animateAdBannerOn" context:NULL];
    // banner is invisible now and moved out of the screen on 50 px
    banner.frame = CGRectOffset(banner.frame, 0, 50);
    [UIView commitAnimations];
    self.bannerIsVisible = YES;
    }

}

- (ADBannerView *)sharedAdBannerView
{
    return adView;
}

[NSNotificationCenter defaultCenter] postNotificationName: メソッドを使用してバリエーションも試しましたが、最終的には同じ問題に直面しています:

問題: ViewController で ADBannerView を表示したいのですが、AppDelegate から取得するにはどうすればよいですか?

私は現在持っています:

ADBannerView *banner = [[UIApplication sharedApplication] sharedAdBannerView];
[self.view addSubview:banner];

しかし、多くのエラーが発生しており、それを回避できないようです。

エラー: UIApplication の可視の @interface がセクター sharedAdBannerView を宣言していません。

私はかなり基本的な何かが欠けていると確信しています。

どんな助けでも大歓迎です...ありがとう、ジェームズ

4

2 に答える 2

0

共有を作成することiAdBannerViewは、これらのトピックの 1 つです。何日も読んで、最終的にはあきらめるか、必要な数行のコードを書くことができます。私は 2 番目の方法を選択し、この数行のコードを作成しました。

import UIKit
import iAd

// Used thrughout the applcation to show banner when possible
private let applicationADBannerView = ADBannerView(adType: ADAdType.Banner)

// Simple base class for controllers to share one banner view.
// To use this class, inherit a view controller from it and add
// a UIView as container for the banner. The size of the
// container is used as banner size
internal class BaseViewControllerWithBanner: UIViewController, ADBannerViewDelegate {
    private var bannerContainer: UIView?

    internal func viewDidLoad(bannerContainer: UIView) {
        super.viewDidLoad()
        self.bannerContainer = bannerContainer
    }

    internal func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) {
        log(error)
        applicationADBannerView.delegate = nil
        applicationADBannerView.removeFromSuperview()
    }

    internal override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        applicationADBannerView.delegate = self
        applicationADBannerView.frame = bannerContainer?.frame ?? CGRectZero
        bannerContainer?.addSubview(applicationADBannerView)
    }

    internal override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)

        applicationADBannerView.delegate = nil
        applicationADBannerView.removeFromSuperview()
    }
}

このクラスを使用するviewDidLoadには、この例のようにメソッドを継承してオーバーライドするだけです。

import UIKit

internal class BanneredViewController: BaseViewControllerWithBanner {
    @IBOutlet weak var bannerViewContainer: UIView! // Position and link this in the xib or storyboard

    internal override func viewDidLoad() {
        log("BanneredViewController: viewDidLoad")
        super.viewDidLoad(bannerViewContainer)
        ... do all other stuff ...
    }
}

そして、それは完璧に機能します。すべてのリクエストの 100% が、iAd をサポートするすべての国で満たされます。

于 2015-01-15T10:43:51.577 に答える
0

にインポートADBannerView.hする必要がありますAppDelegate.m。ところで、Appleのサンプルプロジェクト「iAd Suite」を見てください。

于 2014-12-05T17:19:19.467 に答える