Parsing JSON value on UIPickerview xcode

Discussion in 'iOS Programming' started by dankiiing, Jan 2, 2013.

  1. dankiiing macrumors newbie

    Joined:
    Oct 25, 2012
    #1
    I have a pickerview with which I would want to display values using JSON parsing. I am aware some questions on the site already tackle parsing and pickerview but mine is slightly different in regards to the structure of my json file. Here's a sample of the json file.
    Code:
    [
    {
    "model":"juice",
    "id" :
      [
        {
            "version": "version01"
        },
    
        {
            "version": "version02"
        }
    
      ]
    },
     {
    "model":"cream",
    "id" :
    [
      {
          "version": "cream01"
      },
    
      {
          "version": "cream02"
      }
    ]
    }
    ]
    
    and my .m file

    Code:
    - (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
    
    Basically when I select a model i.e juice or cream on the first column the second column should display its contents with key being 'versions' thus when juice is selected "version01" and "version02" should be displayed on the second column.

    In regards to the line return
    Code:
    [[[self.versionsArray objectAtIndex:row]objectForKey:@"model"]objectForKey:@"version"];
    
    I don't believe it was executed correctly as I get an error
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0xa18c450' .

    Any suggestions ? thanks
     
  2. dejo Moderator

    dejo

    Staff Member

    Joined:
    Sep 2, 2004
    Location:
    The Centennial State
    #2
    What is the type of [self.versionsArray objectAtIndex:row]? I suspect it's an NSString, therefore you can't call objectForKey: on it.
     
  3. dankiiing thread starter macrumors newbie

    Joined:
    Oct 25, 2012
    #3
    Thanks for you reply Dejo, im fairly new to json parsing , how do you suggest I fix this ? I had been on this for weeks
     
  4. dejo Moderator

    dejo

    Staff Member

    Joined:
    Sep 2, 2004
    Location:
    The Centennial State
    #4
    Reevaluate what you are storing in self.versionsArray. Your code suggests you are expecting it to be NSDictionary while the error suggests it is NSString.

    How much do you know about basic debugging (breakpoints, examining variables values, etc.)?
     

Share This Page