0

iOS SDK の NSDictionary* オブジェクトを NSString* に変換するつもりです。

私の NSDictionary オブジェクトに次のキーと値のペアがあるとしましょう: {"aps":{"badge":9, "alert":"hello"}} (値自体が NSDictionary オブジェクトであることに注意してください)。キーと値のペアが {"aps":"badge:9, alert:hello"} のハッシュ マップ (通知値は単なる文字列)。

次のコードを使用して、NsDictionary の値を出力できます。

NSDictionary *userInfo; //it is passed as an argument and contains the string I mentioned above
for (id key in userInfo)
{
     NSString* value = [userInfo valueForKey:key]; 
     funct( [value UTF9String]; // my function 
}

しかし、UTT8String のような値オブジェクトで NSString メソッドを呼び出すことができません。「キャッチされていない例外 NSInvalidArgumentException によるアプリの終了: 理由 [_NSCFDictionary UTF8String]: 認識されないセレクターがインスタンスに送信されました」というエラーが表示されます

4

3 に答える 3

1

辞書構造を再帰的に処理する必要があります。これは、適応できるはずの例です。

-(void)processParsedObject:(id)object{
   [self processParsedObject:object depth:0 parent:nil];
}

-(void)processParsedObject:(id)object depth:(int)depth parent:(id)parent{

   if([object isKindOfClass:[NSDictionary class]]){

      for(NSString * key in [object allKeys]){
         id child = [object objectForKey:key];
         [self processParsedObject:child depth:depth+1 parent:object];
      }                         


   }else if([object isKindOfClass:[NSArray class]]){

      for(id child in object){
         [self processParsedObject:child depth:depth+1 parent:object];
      }   

   }
   else{
      //This object is not a container you might be interested in it's value
      NSLog(@"Node: %@  depth: %d",[object description],depth);
   }


}
于 2012-04-19T06:17:25.347 に答える
0

そのループをメインディクショナリではなく、各子に適用する必要があります。あなたは自分が辞書に辞書を持っていると言いました:

for(id key in userInfo)
{
    NSDictionary *subDict = [userInfo valueForKey:key];
    for(id subKey in subDict)
    {
        NSString* value = [subDict valueForKey:subKey]; 
    }
}

このループは、最初のレベルに辞書全体があることを前提としています。そうでない場合は、danielbeardの再帰メソッドを使用する必要があります。

于 2012-04-19T09:15:36.117 に答える
0

私は最も簡単な方法を見つけました。NSDictionaryオブジェクトのdescriptionメソッドを呼び出すと、必要なものが正確に得られます。最初にそれを逃したのは愚かです。

于 2012-04-20T07:05:23.240 に答える