从视图层次结构中删除iAd的正确方法是什么

 gjagtm2502855737 发布于 2023-02-12 11:47

我试图从视图层次结构中删除iAd视图.我的实现成功从视图中删除了iAd横幅,但我仍然收到以下错误:

Unhandled error (no delegate or delegate does not implement didFailToReceiveAdWithError:)

根据Apple文档,如果用户导航离开显示iAd的屏幕并且您不希望他们暂时返回该屏幕,则删除iAd视图是合理的:

If the user navigates from a screen of content with a banner view to a screen that does
not have a banner view, and you expect them to be on that screen for a long period of 
time, remove the banner view from the view hierarchy, set its delegate to nil and 
release it before transitioning to the new screen of content. More generally, avoid 
keeping a banner view around when it is invisible to the user.

因此,我删除了横幅视图并将委托设置为nil,这导致横幅从视图中消失.但是,我接着开始收到上述错误.它不是很清楚苹果建议怎么做.这就是我所做的.我对iAd的使用是在一个不是UIViewController的类中(即这是一个cocos2d项目).因此,我使用RootViewController.在我班级的头文件中,我有:

RootViewController *viewController;
AppDelegate *app;
BannerViewController *bannerViewController;

在我的类实现文件中,我初始化bannerViewController,如下所示:

app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
viewController = [(AppDelegate *)[[UIApplication sharedApplication] delegate] viewController];

bannerViewController = [[BannerViewController alloc] initWithContentViewController:viewController];
app.window.rootViewController = bannerViewController;

当我准备永久删除iAd横幅时,我尝试从视图层次结构中删除横幅视图,并将其委托设置为nil,如下所示:

if (bannerViewController) {
    [viewController removeFromParentViewController];
    bannerViewController._bannerView.delegate = nil;
    [bannerViewController._bannerView removeFromSuperview];
    [bannerViewController release];
    bannerViewController = nil;
}

bannerViewController来自Apples iAd Suite.视图层次结构的初始化和构造如下:

@interface BannerViewController () 

@end

@implementation BannerViewController {
    ADBannerView *_bannerView;
    UIViewController *_contentController;   // RootViewController
}

- (instancetype)initWithContentViewController:(UIViewController *)contentController
{

    self = [super init];
    if (self != nil) {
        // On iOS 6 ADBannerView introduces a new initializer, use it when available.
        if ([ADBannerView instancesRespondToSelector:@selector(initWithAdType:)]) {
            _bannerView = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner];
        } 
        else {
            _bannerView = [[ADBannerView alloc] init];
        }
        _contentController = contentController; 
        _bannerView.delegate = self;
    }
    return self;
}

- (void)loadView
{
    UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    [contentView addSubview:_bannerView];

    // Setup containment of the _contentController.
    [self addChildViewController:_contentController];
    [contentView addSubview:_contentController.view];
    [_contentController didMoveToParentViewController:self];

    self.view = contentView;

}

我的RootViewController处理iAd BannerViewActionNotification的观察者.

我注意到的是,即使我发布bannerViewController,也不会调用dealloc方法.就像我说的那样,iAd横幅确实从视图中消失了,但错误消息不断出现.这表示我未正确断开与iAd的连接并继续接收广告通知.

那么,我做错了什么?如何根据Apple的建议从视图层次结构中删除横幅视图.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有