1

私はObjCライブラリをバインドしていて、それはすべてうまく機能しますが、1つの問題があります。ObjCライブラリは、別のヘッダーで定義されているいくつかの値を使用しています。

たとえば、次のようなヘッダー:

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

これらのプロパティに応じて、ライブラリはビューにいくつかの変更を加えます(したがって、これらの変更はライブラリにあり、C#コードにはありません)。

これらのプロパティを変更できるように、C#コードからこれらのプロパティにアクセスしたいと思います。ライブラリを変更したいのに動的に変更できない場合は、ライブラリを再構築する必要があります(目標は何ですか)。

これは可能ですか?

私はこれを検索しましたが、2つの提案された解決策を理解していませんでした:

  1. それらをバインディングではなくC#コードに配置する->これは解決策ではないと思います。その場合、ライブラリはこれらの変更を認識しないのでしょうか。(接続なし)
  2. それらを(静的)プロパティとしてバインドする

残念ながら、これを行う方法がわかりません。このヘッダーでは、これらはクラス/インターフェイスではなく、#DEFステートメントのみであるため、これらのプロパティをどの'クラス'で定義する必要があるかわかりません。

その後、ヘッダーは他のいくつかのObjCクラスに含まれます。そこで定義できるかどうかを確認しようとしましたが、これはインターフェイスであり、プロパティは受け入れられません。

つまり、基本的に、私がバインドしている「SomeController」クラスがあり、「SomeController.h」はインターフェイスとして定義されています

@interface SomeController : UIViewController

そして、「SomeController.m」には、

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

何か案は?

よろしく、マット

4

1 に答える 1

2

SOME_PROPERTY_# は実際には変数ではなく、前処理ディレクティブであるため、これは不可能です。

つまり、ObjectiveC プリプロセッサは、ソース コード内の SOME_PROPERTY_# のすべてのインスタンスを、定義した値に置き換えますが、最終的な実行可能ファイルには SOME_PROPERTY_# 変数/定数はありません。

例えば:

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

プリプロセッサによって次のように変換されます。

void foo ()
{
    Bool value = TRUE;
}

ご覧のとおり、変換されたソース コードには SOME_PROPERTY_1 がありません。

これは、SOME_PROPERTY_# の値を動的に変更できないことを意味します。

于 2013-01-05T00:25:02.653 に答える