繁体   English   中英

接口生成器和预处理器

[英]Interface Builder and the preprocessor

在扫描源文件中的IBOutlet参考时,是否有任何方法可以强制/哄骗/鼓励Interface Builder运行C预处理器?

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

我有一些我想做的与财产有关的宏骗术。

首先将宏的原因放在一边(因为它与这个问题不是特别相关,除了提供了动机之外),我最大的绊脚石是IB在识别网点的方式上非常简单。 如果使用宏,则无法说服IB发现出口。

例如,如果我要替换:

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

与我的宏,它看起来像这样:

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

不幸的是,很明显,默认情况下,IB不会执行任何宏扩展,因此无论我是否将IBOutlet放入宏定义或调用宏的参数中,都不知道这是出口。

我只是想知道IB中的某个地方是否有一些晦涩的钩子,该钩子将允许脚本在IB扫描源文件时对其进行预处理。

据我所知,您尝试执行的操作无效。

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

您可以通过使用反向插入模式来解决此问题。 在标准插入模式中,您有一个机器生成的超类,然后是一个人工编写的子类。 机器类的自动更改是由人工编写的类透明继承的(有关此示例的很好的Objective-C示例,请参见MoGenerator。)在反向插入模式中,您将拥有人工编写的超类,然后生成机器(带有宏扩展)子类。 然后,您可以将IB定位于机器类。 机器类将具有IBOutlet标记,因此IB将对其进行拾取。

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

我当前的解决方法是对所有插座重复最小属性定义,以使接口生成器受益,例如:

#ifndef ECPropertyDefine

@property () IBOutlet UIWindow* window;

@property () IBOutlet UITabBarController* tabBarController;

#endif

gcc会忽略此操作(因为定义了ECPropertyDefine),但是由Interface Builder对其进行了解析,Interface Builder对#ifndef一无所知。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM