2012-06-30 3 views
0

Я начинаю во всем программировании и стараюсь внедрить некоторые самообучаемые материалы из книг Big Nerd Ranch. Но я действительно в тупике от этой проблемы, и да, я искал этот и другие форумы для возможных решений без успеха. Вот код:Этот класс не является ключевым значением, совместимым с кодировкой для ключа XXX

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 

файла уже указано в ANKYViewController. Связывание выходов и т. Д. Осуществлялось путем перетаскивания элементов управления вместо ручного кодирования (я сдался, потратив слишком много часов).

Ошибка:

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

Там нет копирования и вставки кода, и это, безусловно, огорчает, что нет никакого упоминания о «repsField» (вместо repFieldxxx) в любом месте.

Надеюсь, что это достаточно информации, которая поможет привести к решению, поскольку я провел дни, просматривая решения других людей без успеха.

Спасибо.

+0

Посмотрите также в файле NIB/XIB; возможно, ссылки на свойства будут там (например, в привязке), даже если они не находятся в вашем коде. –

+0

Обратите внимание, что в сообщении говорится, что 'UIApplication' (не' ANKYViewController ') не соответствует требованиям KVC для' repsField'. –

+0

См. Мой ответ [здесь] (http://stackoverflow.com/questions/11166470/showing-a-uiview-subclass-this-class-is-not-key-value-coding-compliant-for-the/11167245# 11167245) для общего обсуждения этих ошибок. – jrturton

ответ

3

Похоже, проблема заключается в том, что кто-то обращается к экземпляру UIApplication с ключом (repsField), который не соответствует требованиям KVC.

Обновление Я не думаю, что вам даже нужен подкласс, чтобы добавить точку останова. Перейдите к навигатору точки останова и добавьте символическую точку останова для символа -[UIApplication setValue:forUndefinedKey:], а затем запустите приложение.

Я думаю, вы можете отлаживать его путем подкласса UIApplication и установить точку останова в фиктивном переопределении метода setValue:forUndefinedKey:.

В файле, где вы называете UIApplicationMain добавить этот класс:

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

А затем измените третий аргумент UIApplicationMain к @"TestApplication", например:

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

Теперь запустите приложение и оно должно переходите к отладчику, и вы должны уметь видеть, что вызывающий стек вызывает его.

1

Когда появляется это сообщение об ошибке, очень часто бывает плохое соединение в файле xib или раскадровке. Я предполагаю, что это старый пример с файлом MainWindow.xib, в котором владелец файла установлен как класс UIApplication. Скорее всего, соединение в этом xib с выходом repsField в Владелец файла, что, конечно же, не соответствует чему-либо в фактическом классе.

Смежные вопросы

 Смежные вопросы