0

まず第一に、これは質問ですが、申し訳ありませんが、誰かが私を助けてくれることを願っています!

iPhone で UIML レンダラーを作成しています。UIML はインターフェイスを記述するための言語です。XML をレンダリングし、iPhone でインターフェイスを表示したいと考えています。

より良い情報を提供するために、まず私が何をしているのかを説明します。

<?xml version="1.0"?>
<uiml>
    <interface>
        <structure>
          <part id="hoofdView" class="ViewController">
              <part id="viewVoorHoofdview" class="View">
                <part id="label1" class="Label"/>
              </part>
          </part>
        </structure>
        <style>
            <property part-name="label1" name="text">Dit is een label</property>
            <property part-name="label1" name="position">50,50,100,150</property>
        </style>
    </interface>
    <peers>
        <presentation base="cocoa.uiml"/>
    </peers>
</uiml>

これは UIML ドキュメント (インターフェース) です。これは、View と「Dit is een label」というテキストを含む Label を持つ単純な ViewController です。とても抽象的なものを作っています。

ドキュメントを解析すると、class="ViewController" が見つかります

次に、語彙を調べる必要があります。

<d-class id="Label" used-in-tag="part" maps-type="class" maps-to="UILabel">         
            <d-property id="text" return-type="NSString*" maps-type="getMethod" maps-to="text"/>
            <d-property id="text" maps-type="setMethod" maps-to="setText:">
               <d-param type="NSString*"/>
            </d-property>

            <d-property id="position" maps-type="setMethod" maps-to="setFrame:">
               <d-param type="CGRect"/>
            </d-property>
        </d-class>

簡単にするために、語彙の一部を貼り付けただけです。

この語彙では、次のことがわかります。

<d-class id="Label" used-in-tag="part" maps-type="class" maps-to="UILabel">

そして、私は実行時にUILabelを作成しています:

NSObject * createdObject = [[NSClassFromString(className) alloc] init];

次に、createdObject にプロパティを適用する必要があります。text と position の 2 つのプロパティがあります。

語彙でそれらを探します(たとえば、位置を取りましょう)

<d-property id="position" maps-type="setMethod" maps-to="setFrame:">
               <d-param type="CGRect"/>
            </d-property>

ご覧のとおり、メソッドを呼び出すには maps-to と d-param が必要です。しかし、問題が 1 つあります。最初のドキュメントには次のものがあります。

<property part-name="label1" name="position">50,50,100,150</property>

まず、文字列 50,50,100,150 を CGRect に「デコード」する必要があります。これは、setFrame: がパラメーターとして CGRect を必要とするためです。しかし、大きな問題が 1 つあります。これを非常に抽象化する必要がありますが、CGRect は NSObject から継承されていないため、関数を作成できません。

-(NSObject*)convert:(NSString*)stringToConvert;

CGRect は NSObject* ではないためです。

フロートを渡す必要がある場合にも同じ問題が発生します (たとえば、UISlider に)。

<d-property id="minimumValue" maps-type="setMethod" maps-to="setMinimumValue:">
           <d-param type="float"/>
        </d-property>

NSObject はそのスーパークラスではないため、float を返すことはできません。

私の変換方法は次のようになります。

-(NSObject *)convert:(NSString *)data parameterType:(NSString *)paramType {
    NSObject * result;

    if ( [paramType isEqualToString:@"NSString*"] ) {
        result = data;
    } else if ([paramType isEqualToString:@"float"]) {
        //HOW TO DO THIS?
    } else if ([paramType isEqualToString:@"CGRect"]) {
        //HOW TO DO THIS?
    } else {
        NSLog(@"TypeDecoder: No decoding method found for the given parameter Type: %@", paramType);
    }

    return result;
}

コードを追加せずに UIML ドキュメント (語彙) を拡張したいので、これを呼び出すメソッドは非常に抽象的であり、抽象的でなければなりません。これは、これが呼び出されるメソッドです。

-(void)invokeMethod:(Uproperty*)property dProperty:(DProperty *)dProperty guiElement:(NSObject *)object {
//Prepare the invocation
        SEL selector = NSSelectorFromString(dProperty.m_mapsTo);
        NSMethodSignature * signature = [ [object class] instanceMethodSignatureForSelector:selector]; 
        NSInvocation * invocation = [NSInvocation invocationWithMethodSignature:signature];

        //target, selector, arguments
        [invocation setTarget:object];
        [invocation setSelector:selector];

        //Convert the argument to the correct type with the type decoder
        DParam *dParam = [dProperty.m_dParams lastObject];
        NSObject * argument = [m_decoder convert:property.m_data parameterType:dParam.m_type]; //only 1 d-param

        //Then we can set the argument
        [invocation setArgument:&argument atIndex:2]; //2 is the first parameter (0 = self, 1 = _cmd)

        //Invoke the method
        [invocation invoke];
}

この難しい質問で申し訳ありませんが、誰かが私を助けてくれることを願っています!!

4

1 に答える 1

0

NSObject のサブクラスではないすべての型のラッパー クラスを作成することができます。例として、float、int などのオブジェクト ラッパーとしての NSNumber があります。

于 2010-03-24T22:22:17.673 に答える