2

JSON 解析を使用して値を表示するピッカービューがあります。サイトのいくつかの質問が既に解析とピッカービューに取り組んでいることを認識していますが、json ファイルの構造に関して私のものは少し異なります。json ファイルのサンプルを次に示します。

[
{
"model":"juice",
"id" :
  [
    {
        "version": "version01"
    },

    {
        "version": "version02"
    }

  ]
},
 {
"model":"cream",
"id" :
[
  {
      "version": "cream01"
  },

  {
      "version": "cream02"
  }
]
}
]

そして私の.mファイル

- (void)viewDidLoad
    {
    [super viewDidLoad];

    NSURL * serverhost = [NSURL URLWithString:@"http://my.json"];

    NSError *error;

    NSData  * Data  = [NSData  dataWithContentsOfURL: serverhost];

    self.modelsArray= [NSJSONSerialization JSONObjectWithData:Data   options:NSJSONReadingAllowFragments error:&error];

    NSLog(@"%@", modelsArray);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
    if (component == departments)
        return [self.modelsArray count];
    return [self.versionsArray count];
}


#pragma mark Picker Delegate Methods
- (NSString *)pickerView:(UIPickerView *)pickerView
         titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == departments)
          return [[self.modelsArray    objectAtIndex:row]objectForKey:@"model"];
    return [[[self.versionsArray objectAtIndex:row]objectForKey:@"model"]objectForKey:@"version"];
}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:    (NSInteger)component
{
    if (component == departments)
    {
        NSString * selectedRow = [[self.modelsArray objectAtIndex: row]    valueForKey:@"version"];
        NSArray * array = [sybreDepts objectForKey:selectedRow];
        self.
    }
}

@end

基本的に、最初の列でジュースまたはクリームなどのモデルを選択すると、2 番目の列にその内容が表示され、キーが「バージョン」であるため、ジュースを選択すると「version01」と「version02」が 2 番目の列に表示されます。

行に関してはreturn [[[self.versionsArray objectAtIndex:row]objectForKey:@"model"]objectForKey:@"version"];、エラーが発生するため、正しく実行されたとは思えません

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0xa18c450' . Any suggestions ? Thanks
4

1 に答える 1

2

JSON データを適切にインデントして確認すると、次のようになります。

[
    {
        "model": "juice",
        "id" : [
            {
                "version": "version01"
            }, 
            {
                "version": "version02"
            }
        ]
    },
    ....

次に、次の構造があることがわかります (外側の要素から内側の要素まで)。

  1. 配列
  2. モデルバージョンの 2 つのキーを持つオブジェクト/辞書
  3. キーモデルの文字列とキーIDのオブジェクト/辞書
  4. (キーIDのみ) キーバージョンの文字列

したがって、最初のモデルの 2 番目のバージョンにアクセスする場合は、次のように記述する必要があります。

NSArray* versionsArray = [[self.modelsArray objectAtIndex:modelRow] objectForKey:@"id"];
NSString* versionName = [[versionArray objectAtIndex: versionRow] objectForKey:@"version"];

self.versionArrayあなたのコードでは、どこに値が割り当てられているかわかりません。コメントで指摘したように、次の行は JSON データ構造と一致しません。

return [[[self.versionsArray objectAtIndex:row]objectForKey:@"model"]objectForKey:@"version"];

一部:

[[self.versionsArray objectAtIndex:row]objectForKey:@"model"]

インスタンスを返しNSStringます。次に を呼び出すとobjectForKey:@"version"認識されないセレクターが送信されたというエラーが発生します。

アップデート:

変更されたコードは次のようになります。

.h ファイル:

NSInteger modelRow;

.m ファイル:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (component == departments)
        return [self.modelsArray count];

    NSArray* versionsArray = [[self.modelsArray objectAtIndex:modelRow] objectForKey:@"id"];
    return [versionsArray  count];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == departments)
          return [[self.modelsArray objectAtIndex:row]objectForKey:@"model"];

    NSArray* versionsArray = [[self.modelsArray objectAtIndex:modelRow] objectForKey:@"id"];
    return [[versionsArray objectAtIndex:row] objectForKey:@"version"];
}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:    (NSInteger)component
{
    if (component == departments)
    {
        modelRow = row;
        [pickerView reloadComponent:1];
    }
}

@end
于 2013-01-02T12:28:02.080 に答える