Как использовать различные объявления интерфейса во время компиляции, не путая Интерфейсный Разработчик - PullRequest
2 голосов
/ 03 марта 2011

Если у меня несколько сборок моего приложения, например платная и бесплатная версии, и я хочу иметь разные интерфейсы, в зависимости от того, какая сборка, это может сбить с толку Interface Builder.

Например:

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

Когда я загружаю MyViewController.xib в IB, в информационном окне отображаются предупреждения типа «Выход MyLabel« Владельца файла »подключен к« Моему представлению », но« myLabel »больше не являетсяопределено на MyViewController. "

Есть ли способ сделать это, чтобы не перепутать IB?

Полагаю, другой вариант - просто не #ifdef и иметь одно определение для всех сборок.Что произойдет, если я соберу свой контроллер, соответствующий ADBannerViewDelegate (для которого требуется iOS 4), и разверну на iOS 3.2?Если это работает, может быть, нет проблем ...

1 Ответ

2 голосов
/ 04 марта 2011

Я не смог найти способ заставить IB понять структуру, которую вы используете (я пытался сделать это с помощью платного / бесплатного приложения, которое я делал в прошлом). Вот как я решаю свою проблему:

Я не использовал условную компиляцию в своем определении @interface. Я просто определил класс как нормальный, как если бы это была платная, не рекламная версия. Давайте назовем это MyPaidViewController.

@interface MyPaidViewController : UIViewController <UIActionSheetDelegate> {

Затем я создал подкласс MyPaidViewController, который был для бесплатной версии. Что-то вроде:

@interface MyFreeViewController : MyPaidViewController <ADBannerViewDelegate> {

Поскольку для моей бесплатной версии мне обычно требовалось использовать другой xib, нежели я использовал для моей платной версии (поскольку мне приходилось перемещать вещи, чтобы освободить место для рекламы), я бы просто использовал платный xib, используя MyPaidViewController в качестве Владелец файла и мой бесплатный xib используют MyFreeViewController в качестве владельца файла.

Интерфейсный конструктор будет видеть IBOutlets и из суперклассов, поэтому вы сможете ссылаться на myLabel в своем бесплатном xib.

Убедитесь, что MyPaidViewController является частью платных и бесплатных целей сборки, но MyFreeViewController должен быть только частью бесплатной цели сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...