MonoTouch绑定 - 从单独的标头绑定#DEF

时间:2012-12-30 10:15:11

标签: xamarin.ios

我绑定了一个ObjC库,一切运行良好,但我有一个问题。 ObjC库使用的是一些在单独标题中定义的值。

例如,标题为:

#define SOME_PROPERTY_1 TRUE
#define SOME_PROPERTY_2 TRUE
#define SOME_PROPERTY_3 FALSE

依赖于这些属性,库将对视图进行一些更改(因此这些更改位于库中,而不是我的C#代码中。)

我想从我的C#代码访问这些属性,以便我可以更改它们。现在我需要再次构建我的库,如果我想要更改它们,我无法动态更改它们(目标是什么)。

这可能吗?

我已经对此进行了搜索,但我不明白这两个提议的解决方案:

  1. 将它们放入我的C#代码而不是我的绑定中 - >我认为这不是一个解决方案,因为在这种情况下,图书馆不会知道这些变化? (没有连接)
  2. 将它们绑定为(静态)属性
  3. 不幸的是,我不知道该怎么做。在这个标题中,这些不是Class / Interface,只有#DEF语句,所以我不知道我应该在哪个'class'中定义这些属性。

    然后,标题包含在其他一些ObjC类中。我试图看看我是否可以在那里定义它们,但它是一个接口,不接受属性。

    所以基本上,我正在绑定一个“SomeController”类,而“SomeController.h”被定义为接口

    @interface SomeController : UIViewController
    

    然后在“SomeController.m”中你有

    #import "Constants.h" //The file with only #DEF statements
    @implementation SomeController
    {
    ...
    }
    

    有什么想法吗?

    此致 马特

1 个答案:

答案 0 :(得分:2)

这是不可能的,因为你的SOME_PROPERTY_#实际上不是变量,它们是预处理指令。

这意味着ObjectiveC预处理器将使用您定义的值替换源代码中的所有SOME_PROPERTY_#实例,但最终可执行文件中没有SOME_PROPERTY_#variable / constant。

例如:

#define SOME_PROPERTY_1 TRUE
void foo ()
{
    Bool value = SOME_PROPERTY_1;
}

将由预处理器转换为此:

void foo ()
{
    Bool value = TRUE;
}

如您所见,转换后的源代码中没有SOME_PROPERTY_1。

这意味着您无法动态更改SOME_PROPERTY_#的值。