1

iAdを処理する再利用可能なクラスを作成しようとしています。

私の.h file中で私は次のことをします:

#import <iAd/iAd.h>

@protocol AdHelperDelegate;

@interface AdHelper:NSObject<ADBannerViewDelegate>

@property (strong) id<AdHelperDelegate> delegate;
@property (nonatomic, strong) ADBannerView *iAdBannerView;
...
@end

@protocol AdHelperDelegate;
@end

次に.m file、iAdバナーを実装します。

-(void)showBanner
{
    self.iAdBannerView = [[ADBannerView alloc] initWithFrame:CGRectZero];
    self.iAdBannerView.frame = CGRectOffset(self.iAdBannerView.frame, 0, 361);
    self.iAdBannerView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifierPortrait];
    self.iAdBannerView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
    self.iAdBannerView.delegate = self;
    [self.delegate.view addSubview:self.iAdBannerView];
}

もちろんデリゲートメソッドも実装しています-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error

AdHelper私は自分のプロジェクトで次のようなものでを呼び出すことをUIViewController計画しています:

AdHelper *ah = [[AdHelper alloc] init];
ah.delegate = self;
[ah showBanner];

問題は、コンパイラが次Property 'view' not found on object of type 'id<AdHelperDelegate>'
のように言っていることです。デリゲートのビューにアクセスする方法はありますか?

4

2 に答える 2

3

コンパイラがオブジェクトの種類を認識できるように、ViewControllerを手動でキャストする必要があります。

[((MyViewController *)self.delegate).view addSubview:self.iAdBannerView];

ビューの宣言をからに変更することもできますid<AdHelperDelegate>UIViewController<AdHelperDelegate>*これにより、この場合はキャストする必要がなくなります。

于 2013-03-06T14:34:05.703 に答える
1

idをにキャストする必要がありUIViewControllerます。コンパイラには、idにviewプロパティがあることを知る方法がありません。

[((UIViewController *)self.delegate).view addSubview:self.iAdBannerView];
于 2013-03-06T14:34:30.453 に答える