如果我有多个版本的应用程序,付费版和免费版,例如,我希望根据哪个版本拥有不同的界面,那么它似乎会混淆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上部署,会发生什么?如果有效,也许没有问题......
答案 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应该只是免费构建目标的一部分。