ios - iAd 跨 View Controller (单例): Somehow not working

标签 ios objective-c iphone singleton iad

我已经为此苦苦挣扎了很长时间。我的错误在哪里?目前隐藏和显示似乎工作,但每次我“回到”我的 View Controller 时,我都会看到我的 View 向上移动,但那里没有广告。但是我第一次看到 View Controller 时,有一个广告。我究竟做错了什么?
我只想跨 View Controller 展示相同的广告,这就像父 UIViewController 类,许多其他 View Controller 继承自:

#pragma mark View lifecycle
-(void)viewDidLoad
{
    [super viewDidLoad];

    if(![[NSUserDefaults standardUserDefaults] objectForKey:kInAppPurchaseNoAds]){
        self.bannerContainer = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).bannerView;
        self.bannerContainer.frame = CGRectOffset(self.bannerContainer.frame, 0, self.view.frame.size.height);
        [self.view addSubview:self.bannerContainer];
    }
}

//Handle the in app purchases
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    //iAd
    if(![[NSUserDefaults standardUserDefaults] objectForKey:kInAppPurchaseNoAds] && !self.bannerContainer){
        self.bannerContainer.delegate = self;
    }

    if(self.bannerContainer.bannerLoaded){
        [self showBanner];
    }

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkIAdPurchase) name:IAPHelperProductPurchasedNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self hideBanner];
    self.bannerContainer.delegate = nil;

    [[NSNotificationCenter defaultCenter] removeObserver:self name:IAPHelperProductPurchasedNotification object:nil];
}

#pragma mark Check iAd purchase
-(void)checkIAdPurchase
{
    if([[NSUserDefaults standardUserDefaults] objectForKey:kInAppPurchaseNoAds] && self.bannerContainer){
        [self hideBanner];
        [self.bannerContainer removeFromSuperview];
        self.bannerContainer.delegate = nil;
        self.bannerContainer = nil;
    }
}

#pragma mark IAd delegate
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    [self showBanner];
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    [self hideBanner];
}


#pragma mark Show and hide the banner
- (void)showBanner
{
    if(!self.isBannerVisible){
        [self.view layoutIfNeeded];
        [UIView animateWithDuration:0.5
                         animations:^{
                             //Restore the constraint
                             self.mainViewBottomConstraint.constant = 50;
                             //Move the banner on
                             self.bannerContainer.frame = CGRectOffset(self.bannerContainer.frame, 0, -50);
                             [self.view layoutIfNeeded];
                         } completion:^(BOOL finished) {
                             self.isBannerVisible = YES;
                         }];
    }
}

- (void)hideBanner
{
    if(self.isBannerVisible){
        [self.view layoutIfNeeded];
        [UIView animateWithDuration:0.5
                         animations:^{
                             //Restore the constraint
                             self.mainViewBottomConstraint.constant = 0;
                             //Move the banner off
                             self.bannerContainer.frame = CGRectOffset(self.bannerContainer.frame, 0, self.bannerContainer.frame.size.height);
                             [self.view layoutIfNeeded];
                         } completion:^(BOOL finished) {
                             self.isBannerVisible = NO;
                         }];
    }
}

最佳答案

实际上,您正在 AppDelegate 中创建 iAd 实例,而这只是整个应用程序中的一个实例。现在,当您第一次来到 Vc 时,由于 viewdidload 中的代码,它会添加到您的 Vc 中。

现在,当您移动到其他 View Controller 时,该 View Controller 还会在 viewdidload 处添加 iAd。您只有一个 iAd 对象,因此它会一次添加到一个 VC 中。因此,当您移动到其他 Vc 时,iAd 将从该 Vc 中删除并添加到新的 VC..

解决方案:您应该在 ViewWillAppear 中调用 iAD subview 代码...

关于ios - iAd 跨 View Controller (单例): Somehow not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35101908/

相关文章:

ios - 在Non-ARC中,使用第一个参数作为未声明的方法的两倍调用将导致数据损坏。

iphone - 在 Xcode 4 中更改 iPhone 应用程序的名称

ios - 为什么 iOS 17 WidgetKit 中的交互式按钮在应用程序运行时不调用 AppIntent Perform()?

iphone - C代码运行得更快吗?

ios - 在 uicollectionview 中的单元格下方添加水平线

ios - 如何在 UITableView 的部分标题中设置字体颜色?

ios - 如何允许用户从 iOS 照片应用程序中选择照片并在我的应用程序中打开?而且我不想使用 SHARE EXTENSION

iphone - 如何使用 CAShapeLayer 绘制图表?

iphone - NSNetService 问题

objective-c - 自定义 NSTextView 边框问题