1

アプリでモデルの HTML 出力を生成しようとしています。これにより、HTML ファイル内のさまざまなスポットを効果的に調べて、モデル内の関連する値で埋めます。もともと HTML テンプレートを書式設定された文字列として使用するつもりでしたが、後でレイアウトなどに何か変更があった場合、値の順序をテンプレートに表示される順序に合わせるのが面倒で面倒になります。 .

代わりに、私がやろうとしているのは、一種の Ruby スタイルのファイルの文字列補間を実行することです。モデルからの値が必要な場合は、必要なモデル属性の名前を次のように入力します#{key.path}

次に、次の正規表現でこれを処理しようとしています: @"#{([^}]+)}".

これを処理するために、次のセットアップを使用しています。

NSString *processedTemplate = [regex stringByReplacingMatchesInString:template 
                                options:0 
                                range:NSMakeRange(0, template.length) 
                                withTemplate:[self valueForKeyPath:@"$1"]];

ただし、これを実行すると、次のエラーが表示されます。

*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
    reason: '[<Plan 0x78349d0> valueForUndefinedKey:]: this class is not 
             key value coding-compliant for the key $1.'

私が期待しているのは、正規表現の一致を使用して、それを使用してモデルのキー値コーディングに準拠した値を取得できることです。ただし、これは明らかに私が使用している方法では機能しません。

ちなみに、私はこれを正しく使用していると思いますが、これを実行して置き換えるwithTemplate:@"$1"とNULLになります。だから、私はそれを使ってみました:

    NSString *processedTemplate = [template stringByReplacingOccurrencesOfString:@"#{([^}]+)}" 
                                    withString:@"$1"
                                       options:NSRegularExpressionSearch 
                                         range:NSMakeRange(0, template.length)];

ただし、これを実行すると、 のセクションに置き換えられません()。どういうわけか、私は正しいことをしていません。誰にもポインタ/解決策がありますか?

アップデート

そのため、withString:パラメーターは@"$1"正規表現一致データが検出したものとして解釈されるようです。などのメソッドに渡すことができるように、一致データを取得する別の方法はありますvalueForKeyPath:か?

アップデート

ちなみに、理由はわかりませんが、正規表現#{([^}]+)}が期待どおりに一致しません。私が対戦した他の正規表現シミュレーターは、それとうまく一致しているように見えますが、iOS の obj-c では一致しません。文字セットのエスケープで欠けているものはあり#{}ますか?

4

1 に答える 1

2

最初の例では、どのようなオブジェクトselfですか? オーバーライドしましたvalueForKeyPath:か?

このメソッド-valueForKeyPath: は、NSObject が KVC キー パスに基づいて値を返すように定義されています。コード

obj = [anotherObj valueForKeyPath: @"foo.bar.baz"];

最初に に送信fooanotherObj、次にbar結果に送信bazし、その結果に送信して最終結果を返します。

基本的に、ランタイムは というメソッドがないと不平を言っています-$1

ところで、Objective-C では、メソッドへのパラメーターはメソッド自体の前に評価されるため、

[self valueForKeyPath:@"$1"]

は前に stringByReplacingMatchesInString:評価され、 に$1特別な意味はありませんvalueForKeyPath:

于 2011-12-15T17:05:30.597 に答える