【问题标题】:Interface Builder and the preprocessor界面生成器和预处理器
【发布时间】:2010-07-22 20:07:13
【问题描述】:

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

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

我想做一些与属性相关的宏诡计。

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

例如,如果我想替换:

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

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

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

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

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

【问题讨论】:

    标签: objective-c cocoa xcode interface-builder


    【解决方案1】:

    据我所知,您尝试执行的操作是行不通的。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 是的,反向插入将是一个好方法。在这种情况下,可能比实际价值要多一些麻烦,但感谢您的想法。
      【解决方案3】:

      我目前的解决方法是重复任何插座的最小属性定义,以方便界面构建器,如下所示:

      #ifndef ECPropertyDefine

      @property () IBOutlet UIWindow* window;

      @property () IBOutlet UITabBarController* tabBarController;

      #endif

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

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

      【讨论】:

        猜你喜欢
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        相关资源
        最近更新 更多