2010-07-22 82 views
1

当扫描IBOutlet引用的源文件时,有没有办法强制/哄骗/鼓励Interface Builder运行C预处理器?Interface Builder和预处理器

这是一个棘手的问题,我可以看到,因为在一个理想的世界中,它需要用与项目相同的上下文来预处理文件,即使用预编译头文件等(这在IB更有可能工作被集成到XCode中我会猜到)。

我有一些与财产有关的宏观欺骗,我想要做。

撇开宏观原因(因为它与这个问题并不特别相关,除了提供动机)之外,我最大的绊脚石是IB在识别出口方面非常简单。如果我使用我的宏,我无法说服IB去点销售点。

例如,如果我想取代:

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

与我的宏,它会是这个样子:

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

不幸的是,很明显,在默认情况下IB没有按不执行任何宏扩展,因此不知道这是否是一个出口,无论我是否将IBOutlet放入宏定义或放入我称之为宏的参数中。

我只是想知道在IB的某处是否会有一些模糊的钩子,这会让脚本在IB扫描它们时预处理源文件。

回答

1

据我所知,你想要做的事情是行不通的。

1

我不这么认为。 IB实际上不处理,链接或编译任何东西。它似乎没有激活任何脚本。

您可以通过使用反向插入模式来解决此问题。在标准插入模式中,您有一台机器生成的超类,然后是一个人工书写的子类。机器类的自动更改是由人类编写的类透明地继承的(请参阅MoGenerator为此提供了一个良好的Objective-C示例。)在反向插入模式中,您将拥有一个人类编写的超类,然后生成机器宏扩展)子类。然后你将在机器课上瞄准IB。机器类将具有IBOutlet标记,因此IB会将其选中。

您可以将脚本添加到“运行脚本”阶段以运行C预处理器并将机器文件插入到目标中。

+0

是的,反向插入是一个好方法。 在这种情况下可能比实际值得多一点麻烦,但是感谢这个想法。 – 2010-07-22 20:37:54

1

我目前的解决方法是重复任何网点的最小属性定义,界面生成器的好处,像这样:

#ifndef ECPropertyDefine

@property() IBOutlet UIWindow* window;

@property() IBOutlet UITabBarController* tabBarController;

#endif

这被g cc(因为定义了ECPropertyDefine),但是由Interface Builder解析,它对#ifndef一无所知。

不是一个很好的解决方案,因为我重复了属性的定义,并且它们最终可能不一致。我不重复IB忽略的财产属性。