2011-02-27 79 views
6

我在实现ADBannerView及其委托协议时遇到问题。如何实现AdBannerview和ADBannerview委托

我实现下面的代码在我的视图类(也做了视图符合ADBannerViewDelegate协议):

//add iAds 
ADBannerView *adView = [[ADBannerView alloc] initWithFrame: CGRectMake(0, 318, 320, 50)]; 
adView.requiredContentSizeIdentifiers = [NSSet setWithObjects: ADBannerContentSizeIdentifierPortrait, ADBannerContentSizeIdentifierLandscape, nil]; 
adView.delegate = self; 
//adView.delegate = ADBannerViewDelegate; 
[self.view addSubview: adView]; 

然后创建用于ADBannerViewDelegate一类,具有下列的.m

// 
// ADBannerViewDelegate.m 
// 

#import "ADBannerViewDelegate.h" 

@implementation ADBannerViewDelegate 

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ 
    NSLog(@"bannerview did not receive any banner due to %@", error);} 

- (void)bannerViewActionDidFinish:(ADBannerView *)banner{NSLog(@"bannerview was selected");} 

- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave{return willLeave;} 

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {NSLog(@"banner was loaded");} 

@end 

旗帜最终被提出但控制台保持抛出以下类型的错误:

2011-02-27 15:00:54.108 app[31639:207] ADBannerView: Unhandled error (no delegate or delegate does not implement didFailToReceiveAdWithError:): Error Domain=ADErrorDomain Code=5 "The operation couldn’t be completed. Banner view is visible but does not have content" UserInfo=0x6356a40 {ADInternalErrorCode=5, NSLocalizedFailureReason=Banner view is visible but does not have content} 

和委托函数没有做任何事情,所以根本没有NSLog。显然没有捕捉到错误。

我很难过。我想我在视图和代理中的Adbanner视图调用的链接中缺少一些东西。不知道该怎么做或什么是错的。

任何帮助?提前致谢。

杰森

回答

9

为什么你告诉AdBannerView原因,你是它的代表,但你永远不会把它放在你的实施文件。您的实现文件看起来应该像这样(注意与@implmentation行):

// 
// ADBannerViewDelegate.m 
// 

#import "ADBannerViewDelegate.h" 

@implementation ADBannerViewDelegate<ADBannerViewDelegate> 

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ 
    NSLog(@"bannerview did not receive any banner due to %@", error);} 

- (void)bannerViewActionDidFinish:(ADBannerView *)banner{NSLog(@"bannerview was selected");} 

- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave{return willLeave;} 

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {NSLog(@"banner was loaded");} 

@end 

而且还你不应该命名您的类ADBannerViewDelegate。你的班级应该是一个代表(回应它)到ADBannerView但不能命名它。

+0

应该注意的方法:bannerViewActionShouldBegin。逻辑可以是自定义的,但通常返回YES更好。在应用程序中投放了很多广告(因此willLeave通常为NO),但基于此值返回将阻止广告完全投放(如果为“否”),并因此按照AdBannerViewDelegate协议参考(https:///developer.apple.com/library/ios/documentation/UserExperience/Reference/ADBannerViewDelegate_Ref/Reference/Reference.html#//apple_ref/occ/intfm/ADBannerViewDelegate/bannerViewActionShouldBegin:willLeaveApplication :)。 – Shaun 2013-11-13 07:35:02

+0

我有点困惑,不是接口是需要符合协议的不是实现。当我在实现中编写ADViewBannerDelete时,我在测试项目中尝试了这一点,xcode抛出了此错误。 @implementation声明不能通过协议认证 – Alix 2014-07-25 19:01:37

4

我在我的应用程序成功地整合网络成瘾者使用本教程:
http://www.raywenderlich.com/1371/how-to-integrate-iad-into-your-iphone-app
也可能帮助你。

2

你不试图实现一个名为ADBannerViewDelegate的类,你将这些方法放在你的视图类的实现中。

(如果你确实命名您的视图类“ADBannerViewDelegate”,不知道。这是令人困惑的。)

+0

thx。我试图做的是创建一个通用类,充当所有函数的委托。原因是我有很多不同的视图,它们以我所展示的方式调用Adbanner,并且不希望使用相同的代码抛弃所有视图控制器。 – jason 2011-02-27 20:31:07

+0

然后你不应该分配'adView.delegate = self;',你应该创建一个你的泛型类的实例,并将它指定为委托。在这种情况下,您的视图不需要与“AdBannerViewDelegate”协议混淆。 – Anomie 2011-02-27 20:33:54

1

对我来说是目标和设备,我跑它的4.3模拟器和我的iPad 2,但该应用程序是为iPhone 5.1,当我改变了目标都去顺顺当当

+0

+1在ipad模拟器中运行iphone应用程序我在设置ADBannerView代理时立即得到了didFailToReceiveAdWithError,并且从来没有另一个代理调用。在iphone模拟器上运行它(或将应用程序目标更改为通用),只有在将ADBannerView作为子视图添加后才会调用委托,并在此后每30秒调用一次委托。 – 2012-12-15 01:31:29