2011-12-15 13 views
1

私のアプリでモデルのHTML出力を生成しようとしています。これは、HTMLファイル内のさまざまな場所を効果的に通過し、モデル内の関連する値を入力します。もともとは、HTMLテンプレートを書式設定された文字列として使用する予定でしたが、後でレイアウトやその他のものが変更された場合、テンプレートの表示順に値の順序を合わせるのが面倒で面倒です。iOS NSRegularExpressionを使用したRubyスタイルの文字列補間

代わりに、私がしようとしているのは、ファイルのRubyスタイルの文字列補間の一種を実行することです。どこからでも私はモデルから値を得たいと思うので、私はそうしたいモデル属性の名前を入れます:#{key.path}

次に、私は次のRegexでこれを処理しようとしています: @"#{([^}]+)}"

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

私は何を期待することは、私が使用できるということです。私はこれを実行すると、私はエラーを取得し、しかし

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

これを処理するために

、私は次のセットアップを使用しています正規表現と一致し、私のモデルでキー値コーディング準拠の値を取得するためにそれを使用します。しかし、これは明らかに私がそれを使用している方法では動作しません。

私はこの権利を使用していると思いますが、これを置き換えて実行すると、withTemplate:@"$1"はNULLになります。私はこれを実行すると、それは()にセクションを置き換えるものではありません、しかし

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

:だから、私は使用してそれを試してみました。だから私は何か正しいことをしていない。誰でもポインタ/ソリューションを持っていますか?

更新

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

更新

私の側のノートで、私はなぜか分からないが、私はそれが期待するように私の正規表現#{([^}]+)}は一致していません。他の正規表現シミュレータを使ってみても、それにはうまく一致しているようですが、iOSのobj-cでは一致しません。文字セット#{}にエスケープしているものがありますか?

+0

私は全体的な問題の解決策を見つけました。http://stackoverflow.com/questions/8935466/grmustache-formatted-numbers-or-an-html-template-engine-with-number-formatting私の上記の実装が実際には機能していなかった理由、またはそれを修正する方法を誰でも知ることができるように、これを開いておいてください。 –

答えて

2

最初の例では、どのような種類のオブジェクトがselfですか? valueForKeyPath:を上書きしましたか?

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

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

は最初、その結果にbazを送信し、最終的な結果を返し、その後、結果をbarを送信し、anotherObjfooを送信します。

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

[self valueForKeyPath:@"$1"] 

が評価され

ところで、Objective-Cでメソッドのパラメータは、メソッド自体の前に評価され、stringByReplacingMatchesInString:前と$1valueForKeyPath:に特別なことは何もないことを意味します。

+0

NSObjectの拡張です。私は 'setValue:forKeyPath:]'と 'valueForKey:'をこのように使うことができるので、 'valueForKeyPath:'を使うことができない理由はわかりません。 @ "$ 1"はRegexのマッチからの戻り値として解釈されるべきではありませんか? –

+2

@Josh:いいえ '@" $ 1 "'はドル記号とそれに続く数値のリテラル文字列です。 – JeremyP

関連する問題