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

时间:2011-03-03 05:32:50

标签: iphone objective-c cocoa-touch ios interface-builder

如果我有多个版本的应用程序,付费版和免费版,例如,我希望根据哪个版本拥有不同的界面,那么它似乎会混淆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'出口连接到'我的视图',但MyViewController上不再定义'myLabel'。 “

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

我认为另一种选择是不#ifdef它,并且对所有构建都有一个定义。如果我使用符合ADBannerViewDelegate(需要iOS 4)的控制器构建,并在iOS 3.2上部署,会发生什么?如果有效,也许没有问题......

1 个答案:

答案 0 :(得分:2)

我无法找到让IB了解您正在使用的结构的方法(我尝试使用我过去制作的付费/免费应用程序来实现)。这就是我解决问题的方法:

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

@interface MyPaidViewController : UIViewController <UIActionSheetDelegate> {

然后我创建了一个MyPaidViewController的子类,它是免费版本的。类似的东西:

@interface MyFreeViewController : MyPaidViewController <ADBannerViewDelegate> {

因为我通常需要为我的免费版本使用不同的xib而不是我的付费版本(因为我必须移动东西才能为广告留出空间)我只需要付费的xib使用MyPaidViewController作为文件的所有者和我的免费xib使用MyFreeViewController作为文件的所有者。

Interface Builder也会从超级类中看到IBOutlets,因此您将能够在免费的xib中引用myLabel。

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