【问题标题】:iAd Banner Error "Too many instances of iAd"iAd 横幅错误“iAd 实例过多”
【发布时间】:2014-07-12 05:57:27
【问题描述】:

我的一个视图控制器上有一个广告横幅视图,用作我的游戏的说明页面。当多次加载该视图控制器时,我收到以下错误。

WARNING: More than 10 instances of ADBannerView or ADInterstitialView currently exist. This is a misuse of the iAd API, and ad performance will suffer as a result. This message is printed only once.

我在 stackoverflow 上搜索了这个错误,阅读了回复,但对我没有任何帮助。我已经读到您打算发布广告横幅,然后将其归零等。我有并且仍然收到此错误。我的“viewWillAppear”和“viewWillDissapear”的代码如下。任何帮助将不胜感激!

-(void) viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

_adBanner = [[ADBannerView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height, 320, 50)];
_adBanner.delegate = self;
[self.view addSubview:_adBanner];

}

-(void) viewWillDisappear:(BOOL)animated {

[super viewWillDisappear:animated];

if (_adBanner != nil) {
    _adBanner.delegate = nil;
    _adBanner.hidden = YES;
    [_adBanner release];
    _adBanner = nil;

}

}

【问题讨论】:

    标签: ios7 xcode5 iad


    【解决方案1】:

    在将 iAd 设置为 nil 之前,尝试从其超级视图中移除 iAd:

    -(void) viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
    
        if (_adBanner != nil) {
            [_adBanner removeFromSuperview]; // <-new line
    
            _adBanner.delegate = nil;
            _adBanner.hidden = YES;
            [_adBanner release];
            _adBanner = nil;
    }
    

    【讨论】:

    • 嗨,我刚刚尝试使用此代码,但出现了同样的错误。
    • @user3752308 太可惜了,从超级视图中删除它是解决它的常用方法。您对viewWillAppearviewWillDisappear 的调用次数是否大致相同?
    • 不知道如何检查,我只是对这个错误感到很困惑......所有其他有问题的人似乎都可以接受通常的诊断。
    【解决方案2】:

    这里是 iAd 的代码,我已经在我的应用程序中使用,没有任何问题:

    implementation ViewController
    {
        ADBannerView *adView;
        BOOL bannerIsVisible;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
    
        adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
        adView.frame = CGRectOffset(adView.frame, 0, -50);
        adView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifier320x50];
        adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50;
        [self.view addSubview:adView];
        adView.delegate=self;
        bannerIsVisible=NO;
    }
    
    - (void)bannerViewDidLoadAd:(ADBannerView *)banner
    {
        if (!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];
            bannerIsVisible = YES;
        }
    }
    
    - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
    {
        if (bannerIsVisible)
        {
            [UIView beginAnimations:@"animateAdBannerOff" context:NULL];
            // banner is visible and we move it out of the screen, due to connection issue
            banner.frame = CGRectOffset(banner.frame, 0, -50);
            [UIView commitAnimations];
            bannerIsVisible = NO;
        }
    }
    

    【讨论】:

      【解决方案3】:

      不要在单个类中初始化adBannerView,而是在AppDelegate 中创建它。

      我说:

      @property (strong, nonatomic) ADBannerView *adBanner;
      

      在我的AppDelegate.h 和:

      self.adBanner = [[ADBannerView alloc] init];
      

      在我的AppDelegate.m

      然后在我放的单个班级中:

      @property (strong, nonatomic) ADBannerView *adBanner;
      

      在 .h 和 .m 中我放了:

      {
          BOOL _bannerIsVisible;
      }
      

      @interface 的正下方和@implementation 中我放了:

      #pragma mark Ads
      
      
      
      
      - (WTMAppDelegate *) appdelegate {
          return (WTMAppDelegate *)[[UIApplication sharedApplication] delegate];
      }
      
      - (void)bannerViewDidLoadAd:(ADBannerView *)banner
      {
          NSLog(@"Retreieved Ad");
          [self bringBannerBack];
      
      }
      
      - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
      {
          NSLog(@"Failed to retrieve ad");
      
          [self moveBannerViewOffScreen];
      }
      
      - (void)bringBannerBack
      {
      
      
      
          [self.adBanner setAlpha:1];
          [self.adBanner setNeedsDisplay];
          [UIView beginAnimations:@"MoveView" context:nil];
          [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
          [UIView setAnimationDuration:0.1];
          self.adBanner.frame = CGRectMake(0, self.view.bounds.size.height - 50, 320, 50);
          [UIView commitAnimations];
          _bannerIsVisible = YES;
          [self.adBanner setAlpha:1];
      
      }
      //Move the banner off the screen.
      - (void)moveBannerViewOffScreen
      {
      
          [self.adBanner setAlpha:0];
          [self.adBanner setNeedsDisplay];
          _bannerIsVisible = NO;
      
      }
      

      在 viewWillAppear 和 ViewWillDisappear 中:

      - (void) viewWillDisappear:(BOOL)animated{
      
      
          self.adBanner.delegate=nil;
          self.adBanner=nil;
          [self.adBanner removeFromSuperview];
      
      
      }
      
      
      - (void) viewWillAppear:(BOOL)animated
      {
          self.adBanner = [[self appdelegate] adBanner];
          self.adBanner.delegate = self;
          [self.view addSubview:self.adBanner];
      
          if (self.adBanner.bannerLoaded == NO){
              NSLog(@"NO initial banner loaded");
              [self moveBannerViewOffScreen];
          } else {
              NSLog(@"Initial ad loaded");
              [self bringBannerBack];
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        相关资源
        最近更新 更多