2011-09-05 6 views
1

여기에 계속 기본적인 질문을 던져서 미안하지만 다른 곳으로 가야할지 모르겠다. 키 값 코딩을 시연하기 위해 슬라이더를 증가시키기위한 슬라이더, 텍스트 필드 및 버튼이있는 코드를 작성했습니다. 모든 것이 발견되었습니다. 다음 단계는 accessor와 setter 메소드 대신에 'property'와 'synthesize'를 사용하는 것이 었습니다.속성/Synthesize 오류

#import <Foundation/Foundation.h> 
@interface KVCController : NSObject { 
    int fido; 
} 
@property(readwrite, assign) int fido; 
@end 

@implementation KVCController 
@synthesize fido; 

- (id)init{ 
    self = [super init]; 
    if (self) { 
     // Initialization code here. 
     [self setValue:[NSNumber numberWithInt:5] forKey:@"fido"]; 
     NSNumber *n = [self valueForKey:@"fido"]; 
     NSLog(@"fido = %@", n); 
    } 

    return self; 
} 
~~~~~~~ 
@end 

~~~~~ 나는 @implementation의 KVCController에 불완전한 구현 오류가 발생합니다. 내가 'fido'에 대한 get 및 set 메소드를 넣으면 클리어됩니다. @synthesize fido;와 함께 두 번째 오류가 발생합니다. 그것은 구현에서 속성을 선언해야한다고 말합니다. 모든 것이 책에서 올바르게 복사되고 내가 말할 수있는 것처럼 가까이에서 볼 수 있습니다.이 책은 다른 모든 속성의 사용과 합성 된 것처럼 보입니다. 누구나 내가 누락하거나 잘못하고있는 것에 대한 아이디어가 있습니까?

Xcode 4.1에서는 대리인 작업을하지 않을 경우 일반적으로 무시하는 대리인 클래스를 자동으로 만듭니다. 나는 KVC 운동을 위해 자신의 클래스를 만들고 방금 속성을 추가/적절한 수정과 함께 그것에 선언을 합성하고 오류가 발생했습니다. 방금 선언문을 대리자 클래스에 넣고 적절한 IBAction 코드를 적절한 위치로 옮기고 바인딩을 다시 잠그고 내가 만든 클래스를 지우고 모든 것이 잘 작동했습니다. 속성/합성 선언은 대리인 자료처럼 취급해야합니까?

+2

또한'fido'를'int'로 선언했지만'NSNumber'로 초기화하고 있습니다. 여러분이해야 할 일은'fido = 5;'라고 쓰는 것입니다. – Abizern

+0

필자는 키 값 코딩이 객체에서만 작동한다고 말했기 때문에 그것이 원래 그대로 남아있었습니다. 그것을 가져 와서 fido = 5를 넣어도 아무런 차이가 없습니다 (여전히 같은 오류). 나는 당신이 재산에 대한 KVC가 필요하다고 생각/선언을 종합. –

+0

KVC 만 사용하여 개체의 속성을 설정할 수 있습니다. 그렇다고해서 속성 자체가 객체가되어야한다는 것은 아닙니다. – Abizern

답변

2

구현이 불완전한@implementation에서 사용하지 않는 헤더에 -(void)something이 정의되어 있음을 의미합니다. 헤더에 사용되지 않은 메소드가 없는지 확인하십시오. 그럴 경우 헤더에서 제거하거나 구현에 메서드를 만듭니다.

- (void) dosomething 
{ 
    /* blank for now */ 
} 

구현에 -(void)dosomething이있는 경우 헤더에 정의하십시오.

#import <Foundation/Foundation.h> 
@interface KVCController : NSObject { 
    int fido; 
} 
@property(readwrite, assign) int fido; 
- (void) dosomething; 
@end 
+0

연습의 첫 번째 부분에서는 저자가 키 값 코딩을 구현하는 데 긴 시간을 투자하고 있었고 작동하도록했습니다. 그가 property/synthesize로 전환했을 때, 나는 그냥 - (int) fido, - (void) setFido 및 (IBAction) 메소드를 모두 주석 처리 했으므로 헤더에 아무 것도 없도록 썼다. –