this class is not key value coding-compliant for t

2020-05-01 08:13发布

问题:

I'm a beginner in everything programming and have been trying to implement some self learned stuff from the Big Nerd Ranch Books. But I'm really stumped by this problem, and yes, I have searched this and other forums for possible solutions with no success. Here is the code:

ANKYViewController.h:

#import <UIKit/UIKit.h>

@interface ANKYViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *weightFieldDeadlift;
@property (weak, nonatomic) IBOutlet UITextField *repFieldDeadlift;
@property (strong, nonatomic) IBOutlet UILabel *workingOneRMDeadlift;

@property (weak, nonatomic) IBOutlet UITextField *weightFieldBenchPress;
@property (weak, nonatomic) IBOutlet UITextField *repFieldBenchPress;
@property (strong, nonatomic) IBOutlet UILabel *workingOneRMBenchPress;

@property (weak, nonatomic) IBOutlet UITextField *weightFieldSquat;
@property (weak, nonatomic) IBOutlet UITextField *repFieldSquat;
@property (strong, nonatomic) IBOutlet UILabel *workingOneRMSquat;

@property (weak, nonatomic) IBOutlet UITextField *weightFieldMilitaryPress;
@property (weak, nonatomic) IBOutlet UITextField *repFieldMilitaryPress;
@property (strong, nonatomic) IBOutlet UILabel *workingOneRMMilitaryPress;

- (IBAction)calculateOneRM:(id)sender;

@end

ANKYViewController.m:

#import "ANKYViewController.h"

@interface ANKYViewController ()

@end

@implementation ANKYViewController
@synthesize weightFieldDeadlift;
@synthesize repFieldBenchPress;
@synthesize workingOneRMBenchPress;
@synthesize weightFieldSquat;
@synthesize repFieldSquat;
@synthesize workingOneRMSquat;
@synthesize weightFieldMilitaryPress;
@synthesize repFieldMilitaryPress;
@synthesize workingOneRMMilitaryPress;
@synthesize repFieldDeadlift;
@synthesize workingOneRMDeadlift;
@synthesize weightFieldBenchPress;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setWeightFieldDeadlift:nil];
    [self setRepFieldDeadlift:nil];
    [self setWorkingOneRMDeadlift:nil];
    [self setWeightFieldDeadlift:nil];
    [self setRepFieldBenchPress:nil];
    [self setWeightFieldBenchPress:nil];
    [self setWorkingOneRMBenchPress:nil];
    [self setWeightFieldSquat:nil];
    [self setRepFieldSquat:nil];
    [self setWorkingOneRMSquat:nil];
    [self setWeightFieldMilitaryPress:nil];
    [self setRepFieldMilitaryPress:nil];
    [self setWorkingOneRMMilitaryPress:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

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

- (IBAction)calculateOneRM:(id)sender {
    float dw = [[weightFieldDeadlift text]floatValue];
    float dr = [[repFieldDeadlift text]floatValue];
    float d = (dw * dr * 0.0333) + dw;
    NSLog(@"Deadlift: %f", d);
    NSString *deadlift = [[NSString alloc]initWithFormat:@"%f", d];
    [workingOneRMDeadlift setText:deadlift];

    float bpw = [[weightFieldBenchPress text]floatValue];
    float bpr = [[repFieldBenchPress text]floatValue];
    float bp = (bpw * bpr * 0.0333) + bpw;
    NSLog(@"Bench Press: %f", bp);
    NSString *benchPress = [[NSString alloc]initWithFormat:@"%f", bp];
    [workingOneRMBenchPress setText:benchPress];

    float sw = [[weightFieldSquat text]floatValue];
    float sr = [[repFieldSquat text]floatValue];
    float s = (sw * sr * 0.0333) + sw;
    NSLog(@"Squat: %f", s);
    NSString *squat = [[NSString alloc]initWithFormat:@"%f", s];
    [workingOneRMSquat setText:squat];

    float mpw = [[weightFieldMilitaryPress text]floatValue];
    float mpr = [[repFieldMilitaryPress text]floatValue];
    float mp = (mpw * mpr * 0.0333) + mpw;
    NSLog(@"Military Press: %f", mp);
    NSString *militaryPress = [[NSString alloc]initWithFormat:@"%f", mp];
    [workingOneRMMilitaryPress setText:militaryPress];
}
@end

File's owner class is already stated as ANKYViewController. Linking the outlets etc was by control dragging instead of manually coding (I gave up after spending too many hours).

The error:

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

There's no copy and pasting of code, and it's certainly distressing that there is no mentioning of "repsField"(instead of repFieldxxx) anywhere.

I hope that this is enough information to help lead to a solution, as I've spent days looking through other people's solutions with no success.

Thanks.

回答1:

Looks like the problem is that someone is accessing the UIApplication instance with a key (repsField) that is not KVC compliant.

Update I don't think you even need to subclass to add a breakpoint. Go to the breakpoint navigator and add a symbolic breakpoint for symbol -[UIApplication setValue:forUndefinedKey:] and then run the application.

I think you can debug it by subclassing UIApplication and set a breakpoint in a dummy override of the setValue:forUndefinedKey: method.

In the file where you call UIApplicationMain add this class:

@interface TestApplication : UIApplication
@end
@implementation TestApplication
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    [super setValue:value forUndefinedKey:key]; // set breakpoint here
}
@end

And then change the third argument to UIApplicationMain to @"TestApplication", for example:

UIApplicationMain(argc, argv, @"TestApplication", NSStringFromClass([AppDelegate class]));

Now run the application and it should break into to debugger and you should be able to see the call stack causing it.



回答2:

When this error message appears it is very often a bad connection in a xib file or storyboard. I'll guess that this is an old example that has a MainWindow.xib file in it, with the File's Owner set as the UIApplication class. There is most likely a connection in that xib to an outlet called repsField in the File's Owner which, of course, does not match anything in the actual class.