如何在编译时使用不同的接口声明而不会混淆Interface Builder

如果我有我的应用程序,付费和免费版本的多个版本,例如,我想有不同的接口,取决于哪个版本,似乎混淆了界面生成器。

例如:

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

当我在IB中加载MyViewController.xib时,它会在“信息”窗口中显示警告,例如“文件所有者”的'myLabel'出口连接到'我的视图',但'MyLabel'不再在MyViewController上定义。

有没有办法做到这一点,以免混淆IB?

我想另外一个select就是不用#ifdef它,并且对所有的构build有一个定义。 如果我使用符合ADBannerViewDelegate(需要iOS 4)的控制器进行构build,会发生什么情况,并在iOS 3.2上部署? 如果这样做,也许没有问题…

我一直无法find让IB了解你使用的结构的方法(我试图用我以前制作的付费/免费应用程序来完成)。 这是我如何解决我的问题:

我没有在@interface定义中使用条件编译。 我只是把它定义为正常,就好像它是付费的非广告版本一样。 我们称之为MyPaidViewController。

 @interface MyPaidViewController : UIViewController <UIActionSheetDelegate> { 

然后我创build了免费版本的MyPaidViewController的子类。 就像是:

 @interface MyFreeViewController : MyPaidViewController <ADBannerViewDelegate> { 

由于我通常需要为我的免费版本使用不同的xib,因为我需要为付费版本使用不同的xib(因为我不得不为了腾出空间来放置广告),所以我只需要付费的xib使用MyPaidViewController作为文件的所有者,我的免费xib使用MyFreeViewController作为文件的所有者。

Interface Builder也会从超类中看到IBOutlets,所以你可以在你的免费的xib中引用myLabel。

确保MyPaidViewController是付费和免费构build目标的一部分,但MyFreeViewController应该只是免费构build目标的一部分。