Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 接口生成器和预处理器_Objective C_Cocoa_Xcode_Interface Builder - Fatal编程技术网

Objective c 接口生成器和预处理器

Objective c 接口生成器和预处理器,objective-c,cocoa,xcode,interface-builder,Objective C,Cocoa,Xcode,Interface Builder,在扫描源文件以获取IBOutlet引用时,有没有办法强制/诱使/鼓励Interface Builder运行C预处理器 我可以看出,这是一个棘手的问题,因为在理想情况下,它需要使用与项目相同的上下文对文件进行预处理,即使用预编译头等(我想,当IB集成到XCode中时,这更可能起作用) 我想做一些与房地产相关的宏观骗局 撇开宏的原因不谈(因为它与这个问题无关,只是提供了一个动机),我的大绊脚石是IB在识别出口的方式上过于简单。如果我使用宏,我无法说服IB发现出口 例如,如果我想替换: @属性(保留,

在扫描源文件以获取IBOutlet引用时,有没有办法强制/诱使/鼓励Interface Builder运行C预处理器

我可以看出,这是一个棘手的问题,因为在理想情况下,它需要使用与项目相同的上下文对文件进行预处理,即使用预编译头等(我想,当IB集成到XCode中时,这更可能起作用)

我想做一些与房地产相关的宏观骗局

撇开宏的原因不谈(因为它与这个问题无关,只是提供了一个动机),我的大绊脚石是IB在识别出口的方式上过于简单。如果我使用宏,我无法说服IB发现出口

例如,如果我想替换:

@属性(保留,非原子)IBUIWindow*窗口

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

ECPropertyDefine(窗口,UIWindow*,保留,非原子)

不幸的是,很明显,默认情况下IB不执行任何宏扩展,因此不知道这是一个出口,不管我是将IBOutlet放入宏定义中,还是放入调用宏的参数中


我只是想知道IB中是否有某个模糊的钩子,它允许脚本在IB扫描源文件时对源文件进行预处理。

据我所知,您试图做的是行不通的。

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

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


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

为了interface builder的利益,我当前的解决方法是重复任何插座的最小属性定义,如下所示:

\ifndef ECPropertyDefine

@property()IBUIWindow*窗口

@property()ibuitabbarcontroller*tabBarController

#endif

gcc忽略了这一点(因为定义了ECPropertyDefine),但接口生成器对#ifndef一无所知


这不是一个很好的解决方案,因为我重复了属性的定义,结果可能不一致。我不重复IB忽略的属性属性。

是的,反向插入将是一个很好的方法。在这种情况下,可能比实际值的麻烦多一点,但谢谢你的想法。