0

I've seen a lot of similar questions but none of them solve my problem or made the solution clear to me. I've a made a nib file with a UIPickerView. When I run the application I get this error.

Terminating app due to uncaught exception 'NSUnknownKeyException',
reason: '[<UIApplication 0x68633e0> setValue:forUndefinedKey:]:
this class is not key value coding-compliant for the key pickerview.'

My ViewController.h

#import <UIKit/UIKit.h>
#define CATEGORY 0
#define VALUES 1

@interface ViewController : UIViewController <UIPickerViewDelegate , UIPickerViewDataSource> {
    NSDictionary* dictionary;
    NSArray *keys,*values;
    IBOutlet UIPickerView *pickerview;
}
@property (retain,nonatomic) NSArray *keys, *values;
@property (retain,nonatomic) NSDictionary *dictionary;
@property (retain,nonatomic) UIPickerView *pickerview;
@end

My ViewController.m

#import "ViewController.h"

@implementation ViewController
@synthesize keys,values,dictionary;
@synthesize pickerview;

-(void)dealloc {
    [keys release];
    [values release];
    [dictionary release];
    [pickerview release];
    [super dealloc];
}

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

#pragma mark - View lifecycle
- (void)viewDidLoad
{
    NSBundle* bundle = [NSBundle mainBundle];
    NSString* str = [bundle pathForResource:@"testlist" ofType:@"plist"];
    NSDictionary* tempd = [[NSDictionary alloc] initWithContentsOfFile:str];
    self.dictionary = tempd;
    [tempd release];
    self.keys = [dictionary allKeys];
    self.values = [dictionary objectForKey: [keys objectAtIndex:0]];
   [super viewDidLoad];
}

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (component == CATEGORY) {
        return keys.count;
    }
    return values.count;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    if (component == CATEGORY) {
        NSArray* tvalues = [dictionary objectForKey:[keys objectAtIndex:row]];
        self.values = tvalues;
        [pickerview selectRow:0 inComponent:VALUES animated:YES];//Xreiazetai?
        [pickerview reloadComponent:VALUES];
    }
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (component == CATEGORY) {
        return [keys objectAtIndex:row];
    }
    return [values objectAtIndex:row];
}

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

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

I made sure that dataSource , delegate outlets of the Picker are pointing to the File's Owner as also the pickerview referencing outlet.

UPDATE

The whole stack trace

GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug  8 20:32:45 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".Attaching to process 1236.
2012-04-18 17:07:33.444 TestPlist[1236:f803] *** Terminating app due 
to uncaught exception 'NSUnknownKeyException', reason: '[<UIApplication 0x6a68e90> setValue:forUndefinedKey:]: 
this class is not key value coding-compliant for the key pickerview.'
    *** First throw call stack:
    (0x13bb052 0x154cd0a 0x13baf11 0x9b2032 0x923f7b 0x923eeb 0x93ed60 0x23191a 0x13bce1a     
0x1326821 0x23046e 0x232010 0x1214a 0x12461 0x117c0 0x20743 0x211f8 0x14aa9 0x12a5fa9 0x138f1c5 
0x12f4022 0x12f290a 0x12f1db4 0x12f1ccb 0x112a7 0x12a9b 0x20a2 0x2015)
            terminate called throwing an exceptionsharedlibrary apply-load-rules all

(gdb) 

Here is the file for anyone who wonders what is the problem. I'll appreciate a lot.

Community
  • 1
  • 1
giannis christofakis
  • 8,201
  • 4
  • 54
  • 65
  • Read the post of **TexhZen** on this link http://stackoverflow.com/questions/3088059/this-class-is-not-key-value-coding-compliant-for-the-key – iDhaval Apr 18 '12 at 13:56
  • How this will help me ,I only have one `UIViewController` named `ViewController` and the xib file shows the correct name in the inspector.I also checked the names of the `IBOutlets` and I can't see anything wrong. – giannis christofakis Apr 18 '12 at 14:06

2 Answers2

1

Go into the TestPlist-Info.plist file in your project and remove this line:

Main nib file base name     ViewController

That's incorrect, you do not need this reference as it's all handled in your application:didFinishLaunchingWithOptions: method.

InsertWittyName
  • 3,930
  • 1
  • 22
  • 27
0

I'm not much of an IB user, but shouldn't you define the property as IBOutlet, not the attribute itself?

@property (retain,nonatomic) IBOutlet UIPickerView *pickerview;

And why are you not using ARC for memory management - that simplifies things a lot (no more retain and release), so if you don't have a particular reason for not using it you should switch to ARC.

TheEye
  • 9,280
  • 2
  • 42
  • 58