2012-07-30 2 views
0

나는 어리 석었고 내가 프로그래밍 한대로 지속적으로 테스트하지 않았으므로 이제 오류가 들끓었습니다. 프로그래머블 계산기에서 일하고 있습니다. 내가 실행하면 아무것도 표시하기 전에 충돌하고 나에게이 메시지를 제공합니다키 - 값 코딩 컴플라이언스

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

내가 버그를 찾기 위해 NSLog를 사용 싶지만, 충돌 아무것도 쇼 전에 일어날 때 내가 어디를 시도하는 모른다 쪽으로. 내가 뭘 잘못하고 있다고 생각하니? CalculatorBrain.m이야 여기

#import "CalculatorViewController.h" 
#import "CalculatorBrain.h" 

@interface CalculatorViewController() 
@property (nonatomic) BOOL userIsEnteringNumber; 
@property (nonatomic) BOOL numberIsNegative; 
@property (nonatomic,strong) CalculatorBrain *brain; 
@end 

@implementation CalculatorViewController 
@synthesize display = _display; 
@synthesize descriptionLabel = _descriptionLabel; 
@synthesize userIsEnteringNumber = _userIsEnteringNumber; 
@synthesize numberIsNegative; 
@synthesize brain = _brain; 


-(CalculatorBrain *)brain 
{ 
if (!_brain) _brain = [[CalculatorBrain alloc] init]; 
return _brain; 
} 


//This adds a pressed digit to the display label. 

- (IBAction)digitPressed:(UIButton *)sender 
{ 
NSString *digit = sender.currentTitle; 

//Enter digit if it wouldn't create a two-decimal-point case. 
NSRange range = [self.display.text rangeOfString:@"."]; 
if (range.location==NSNotFound || (![digit isEqualToString:@"."])) 
    if (self.userIsEnteringNumber) 
    { 
     self.display.text = [self.display.text stringByAppendingString:digit]; 
     self.descriptionLabel.text = [self.display.text stringByAppendingString:@" "]; 
    } 
    else 
    { 
     self.descriptionLabel.text = [self.descriptionLabel.text stringByAppendingString:digit]; 
     self.descriptionLabel.text = [self.descriptionLabel.text stringByAppendingString:@" "]; 
     if (![sender.currentTitle isEqualToString:@"."]) 
     { 
      self.display.text = digit; 
     } 
     else 
     { 
      self.display.text = @"0."; 
     } 
     self.userIsEnteringNumber = YES; 
    } 
} 


//This sets up an operation. 

- (IBAction)operationPressed:(UIButton *)sender 
{ 
if (self.userIsEnteringNumber) [self enterPressed]; 
NSString *operation = sender.currentTitle; 
double result = [self.brain performOperation:operation]; 
self.display.text = [NSString stringWithFormat:@"%g",result]; 
{ 
    NSString *descr = [self.brain description]; 
    self.descriptionLabel.text = descr; 
} 
} 


- (IBAction)enterPressed 
{ 
NSCharacterSet *set = [NSCharacterSet decimalDigitCharacterSet]; 
NSRange range = [self.display.text rangeOfCharacterFromSet:set]; 
if (range.location==NSNotFound) 
{ 
    [self.brain pushOperandAsVariable:self.display.text]; 
} 
else 
{ 
    [self.brain pushOperand:[self.display.text doubleValue]];   
} 

self.userIsEnteringNumber = NO; 
} 

@end 

을 그리고 :

가 여기에 생략 한 미완성, 주석 처리 된 코드에 대한 몇 가지 추가 속성 선언으로, CalculatorViewController.m있어

#import "CalculatorBrain.h" 

@interface CalculatorBrain() 
@property (nonatomic, strong) NSMutableArray *programStack; 
@property (nonatomic,strong)NSDictionary *variableValues; 
@end 

@implementation CalculatorBrain 

@synthesize programStack = _programStack; 
@synthesize variableValues = _variableValues; 

- (NSMutableArray *)programStack 
{ 
if (!_programStack) _programStack = [[NSMutableArray alloc] init]; 
return _programStack; 
} 

- (id)program 
{ 
return [self.programStack copy]; 
} 


//Here are the two types of pushes that the ViewController can implement. First, operand pushes . . . 

- (void)pushOperand:(double)operand 
{ 
[self.programStack addObject:[NSNumber numberWithDouble:operand]]; 
} 


//. . . and then variable pushes. 

- (void) pushOperandAsVariable:(NSString *)variable 
{ 
//Create dictionary 
//Move this later on to ViewController but for now leave where it is.... 
NSMutableArray *variablesUsed = [[NSMutableArray alloc] init]; 
NSArray *objects = [[NSArray alloc] initWithObjects:[NSNumber numberWithDouble:3],[NSNumber numberWithDouble:4.1],[NSNumber numberWithDouble:-6],[NSNumber numberWithDouble:4.5298], [NSNumber numberWithDouble:3.14159], nil]; 
NSArray *keys = [[NSArray alloc] initWithObjects:@"x",@"y",@"z",@"foo", @"π", nil]; 
NSDictionary *variableValues = [[NSDictionary alloc] initWithObjects:objects forKeys:keys]; 

//Check program for keys 
    NSNumber *operand; 
for (int i=0; i<keys.count; i++) 
{ 
    if ([[keys objectAtIndex:i] isEqual:variable]) 
     [variablesUsed addObject:variable]; 
    operand = [variableValues objectForKey:variable]; 
} 
[self.programStack addObject:operand]; 
} 

- (double)performOperation:(NSString *)operation 
{ 
[self.programStack addObject:operation]; 
return [[self class] runProgram:self.program]; 
} 

+ (double)popOffStack:(NSMutableArray *)stack 
{ 
double result = 0; 
id topOfStack = [stack lastObject]; 
if (topOfStack) [stack removeLastObject]; 
if ([topOfStack isKindOfClass:[NSNumber class]]) 
{ 
    result = [topOfStack doubleValue]; 
} 

//Here are the results for various operations. 

else if ([topOfStack isKindOfClass:[NSString class]]) 
{ 
    NSString *operation = topOfStack; 
    if ([operation isEqualToString:@"+"]) 
    { 
     result = [self popOffStack:stack] + 
     [self popOffStack:stack]; 
    } 
    else if ([@"*" isEqualToString:operation]) 
    { 
     result = [self popOffStack:stack] * 
     [self popOffStack:stack]; 
    } 
    else if ([operation isEqualToString:@"-"]) 
    { 
     double subtrahend = [self popOffStack:stack]; 
     result = [self popOffStack:stack] - subtrahend; 
    } 
    else if ([operation isEqualToString:@"/"]) 
    { 
     double divisor = [self popOffStack:stack]; 
     if (divisor) result = [self popOffStack:stack]/divisor; 
    } 
    else if ([operation isEqualToString:@"sin"]) 
    { 
     result = sin([self popOffStack:stack]); 
    } 
    else if ([operation isEqualToString:@"cos"]) 
    { 
     result = cos([self popOffStack:stack]); 
    } 
    else if ([operation isEqualToString:@"√"]) 
    { 
     result = sqrt([self popOffStack:stack]); 
    } 
    else if ([operation isEqualToString:@"π"]) 
    { 
     result = M_PI; 
    } 
} 
return result; 
} 

+ (double)runProgram:(id)program 
{ 
//Run program. 
NSMutableArray *mutableCopyOfProgram; 
if ([program isKindOfClass:[NSArray class]]) 
{ 
    mutableCopyOfProgram = [program mutableCopy]; 

return [self popOffStack:mutableCopyOfProgram]; 
} 
else return 0; 
} 

@end 

을 언제나 감사 너의 도움으로.

답변

3

가장 일반적인 원인은 CalculatorViewController 개체가 스토리 보드 또는 xib 파일에 정의되어 있고 그래픽 인터페이스의 항목에 "설명"이라는 콘센트에 대한 링크가 있다는 것입니다. 그 사이에, 해당 클래스의 코드에 더 이상 description 콘센트가 없습니다.

이것은 일반적으로 인터페이스 빌더의 길잃은 참조를 추적하여 제거함으로써 해결됩니다.

+0

넵. 그것은 그것을 고쳤다. 나는'descriptionLabel'으로'description'을 개명 했었지만 처음에는'description'을 없앴습니다 .... –