Интерфейсный Разработчик и препроцессор - PullRequest
1 голос
/ 23 июля 2010

Есть ли способ заставить / вызвать / заставить Interface Builder запускать препроцессор C при сканировании исходных файлов на ссылки IBOutlet?

Это сложная проблема, я вижу, поскольку в идеальном мире необходимо предварительно обработать файл с тем же контекстом, что и проект, то есть с предварительно скомпилированными заголовками и т. Д. (Это гораздо более вероятно, если IB работает встроенный в XCode я бы догадался).

У меня есть некоторые хитрости с макросами, которые я хочу сделать.

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

Например, если я хочу заменить:

@property (retain, nonatomic) IBOutlet UIWindow* window;

с моими макросами это будет выглядеть примерно так:

ECPropertyDefine(window, UIWindow*, retain, nonatomic);

К сожалению, очевидно, что по умолчанию IB не выполняет никакого расширения макроса, и, следовательно, не имеет ни малейшего понятия, что это выход, независимо от того, помещаю ли я IBOutlet в определение макроса или в параметры, которые я вызываю макрос с.

Мне было просто интересно, может ли где-нибудь в IB быть какой-то неясный хук, который позволил бы сценарию предварительно обрабатывать исходные файлы при их сканировании IB.

Ответы [ 3 ]

1 голос
/ 23 июля 2010

Я так не думаю. IB на самом деле ничего не обрабатывает, не связывает и не компилирует. Это не похоже на активацию каких-либо сценариев вообще.

Вы можете обойти это, используя шаблон обратной вставки. В стандартном шаблоне вставки у вас есть суперкласс, сгенерированный машиной, а затем написанный человеком подкласс. Автоматические изменения машинного класса прозрачно наследуются написанным человеком классом (хороший пример этого приведен в MoGenerator.) В шаблоне обратной вставки у вас будет написанный человеком суперкласс, а затем сгенерированный машиной макроразложение) подклассы. Тогда вы нацеливаетесь на IB в классе машин. Класс машины будет иметь маркер IBOutlet, поэтому IB его подберет.

Вы можете добавить сценарий на этапе «Выполнить сценарий» для запуска препроцессора C и вставки машинных файлов в цель.

1 голос
/ 23 июля 2010

Мой текущий обходной путь - это повторение минимального определения свойства для любых выходов в интересах построителя интерфейса, например:

#ifndef ECPropertyDefine

@property () IBOutlet UIWindow* window;

@property () IBOutlet UITabBarController* tabBarController;

#endif

Это игнорируется gcc (потому что ECPropertyDefine определен), но анализируется Интерфейсным Разработчиком, который ничего не знает о # ifndef.

Не очень хорошее решение, потому что я повторяю определение собственности, и они могут оказаться непоследовательными. Я не повторяю атрибуты свойств, которые IB игнорирует.

1 голос
/ 23 июля 2010

Насколько я знаю, то, что вы пытаетесь сделать, не сработает.

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