2011-03-03 4 views
1

たとえば、私のアプリ、有料版、無料版の複数のビルドを持っていて、どのビルドに応じて異なるインターフェイスを使用したいのですが、インターフェイスを混乱させるようですビルダー。私はIBでMyViewController.xibをロードコンパイル時に別のインターフェイス宣言を混乱させることなく使用する方法Interface Builder

// MyViewController.h 
#ifdef FREE 
@interface MyViewController : NSObject <UIActionSheetDelegate, ADBannerViewDelegate> 
#else 
@interface MyViewController : NSObject <UIActionSheetDelegate> 
#endif 
{ 
    IBOutlet UILabel* myLabel; 
} 
- (IBAction) myAction:(id)sender; 

が、それはファイルの所有者」の 『mylabelという』アウトレット 『がマイビュー』に接続されている」などの情報ウインドウで警告を示しています。たとえば

'myLabel'はMyViewControllerで定義されていません。 "

IBを混乱させないようにこれを行う方法はありますか?

私は他のオプションが#ifdefではなく、すべてのビルドに対して1つの定義しか持たないと仮定します。 ADBannerViewDelegate(iOS 4が必要)に準拠したコントローラでビルドし、iOS 3.2にデプロイするとどうなりますか?それがうまくいけば、おそらく問題はありません...

答えて

2

私はIBが使用している構造を理解する方法を見つけ出すことができませんでした(私は有料/無料のアプリでやろうとしました過去に作られた)。これは私の問題を解決する方法です:

私は@interface定義で条件付きコンパイルを使用しませんでした。私はちょうどそれが支払われた非広告版であるかのように、クラスを正常と定義しました。それをMyPaidViewControllerと呼ぶことにしましょう。

@interface MyPaidViewController : UIViewController <UIActionSheetDelegate> { 

次に、無料版のMyPaidViewControllerのサブクラスを作成しました。ような何か:

@interface MyFreeViewController : MyPaidViewController <ADBannerViewDelegate> { 

(私が広告のための部屋を作るために周りのものを移動しなければならなかったので)私は通常私は有料版のためにしたよりも、私の無料版のために別のXIBを使用するために必要なので、私がするのと同じ有料のxibはMyPaidViewControllerをFile's Ownerとして使用し、Free xibはMyFreeViewControllerをFile's Ownerとして使用します。

Interface BuilderにはスーパークラスのIBOutletも表示されるため、無料のxibでmyLabelを参照できるようになります。

MyPaidViewControllerが有料ビルドターゲットとフリービルドターゲットの一部であることを確認しますが、MyFreeViewControllerはフリービルドターゲットの一部である必要があります。

+0

+1にはもう少し作業が必要ですが、コード全体に#ifdefsを振りかざす必要はありません。私はなぜこれを解決するために継承を使用することが私に起こらなかったのか分かりません。非常にエレガントなソリューション、ありがとう! – zpasternack

関連する問題