2010-02-11 5 views
0

3 가지 프로토콜의 메소드를 구현하는 인터페이스가있는 응용 프로그램을 개발해야합니다. 가정 프로토콜 A는 프로토콜 B 및 프로토콜 C를 확장하고 ...Objective-C의 @interface에서 @protocol 구현

을 인터페이스 프로토콜 A. 이 내 코드는 모습입니다,

// This is in MyClass.h file 

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import "protocol_A" 
@interface MyClass : NSObject <protocol_A> 
{ 
} 
@end 

//This is MyClass.m file 
#import "MyClass.h" 

@implementation myClass 

-(void)methodinA 
{ 
NSLog(@"I'm in protocol_A"); 
} 
} 
-(void)methodinB 
{ 
NSLog(@"I'm in protocol_B"); 
} 

-(void)methodinC 
{ 
NSLog(@"I'm in protocol_C"); 
} 

@end 

//This is protocol_A.h file 
#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import "protocol_B.h" 
#import "protocol_C.h" 

@protocol protocol_A <protocol_B, protocol_C> 

-(void)methodinA; 
@end 

//This is in protocol_B.h file 
#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
@protocol protocol_B 
    -(void)methodinB; 
@end 

//This is in protocol_C.h file 

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
@protocol protocol_C 
    -(void)methodinC; 
@end 

난 예외를 받고 있어요을 구현하고, 내 응용 프로그램이 충돌지고

***Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MyClass 0X323nm31>setvalue:forundefinedKey:]:this class is not key value coding-compilant for the key window'. 

Plz 전화 해이 문제를 해결하는 방법 ??

+0

충돌은 프로토콜과 완전히 관련이 없습니다. 다른 질문을하십시오. 인터페이스 빌더에서 '윈도우'바인딩을 가지고 있다고 확신 할 수 있습니까? – bbum

답변

2

그래서 반드시 본을 받고있어 어디에 (그리고 그 이유 당신이 3 번을 얻고있는) 당신이 가지고있다 당신은 헤더를 가져올 필요 당신의 프로토콜 정의에서 실수. 귀하는 :

//This is in protocol_C.h file 

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
@protocol protocol_C 
{ 
} 
-(void)methodinC; 
@end 

프로토콜에서 클래스 멤버를 선언 할 수 없습니다 : 오직 방법. 이 때문에 당신은 (그리고 당신이 발견 한 것처럼) 은 프로토콜 정의에서 중괄호을 가질 수 없습니다. 따라서 프로토콜 정의에 다음이 필요합니다.

//This is in protocol_C.h file 

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
@protocol protocol_C 

-(void)methodinC; 

@end 

문제를 제거하면 문제를 해결할 수 있습니다.

새 파일을 만들 때 자주 Xcode의 새로운 클래스 파일 프로세스를 사용합니다. 다음은 Xcode의 새로운 protocol_D 선언의 내용입니다.

#import <Cocoa/Cocoa.h> 

@protocol protocol_D 


@end 

희망이 있습니다.

TL : 프로토콜 정의에 중괄호를 사용할 수 없습니다.

+0

안녕하세요 .. 슈퍼 !!! 감사합니다. 'NSUnknownKeyException', 이유 : '[ setValue : forUndefinedKey :] :이 클래스는 키 값 coding-complia가 아닙니다. 핵심 창에 대한 NT '. – suse

+0

이 문제를 해결하려면 실제 코드를 게시해야합니다. 표시되는 정확한 오류 메시지를 복사해서 붙여 넣을 수 있습니까? 내가 작성한 코드 – CajunLuke

+0

은 실제 코드이며 또한 복사 - n - 동일한 오류 붙여 넣기 – suse

0

프로토콜은 일반적으로 .h 파일에 있습니다. 언제 어디에서나 사용할 계획이면 .h 파일로 이동하십시오.

다른 모든 것과 마찬가지로 프로토콜을 사용하기 전에 프로토콜 정의가 포함 된 .h 파일 #import이 필요합니다.

그래서 MyClass.h에서 (실제로 대문자이어야합니다 - 클래스는 항상 Objective-C로 대문자로 표시됩니다), #import 다양한 프로토콜 .h 파일.

+0

안녕하세요, ... 위의 코드를 편집했습니다. MyClass.h 파일에서 #import 을 수행했습니다.왜냐하면 inturn은 다른 protocol_B와 protocol_C를 확장하기 때문에 tat가 MyClass에서 구현하고있는 유일한 프로토콜이기 때문에 MyClass의 모든 메토를 정의하게 될 것입니다. 나는 실수를 알아 내기가 쉽지 않다. plz 도움 .. – suse

+0

내가 protocol_B 및 protocol_C MyClass.h도 가져올까요 ?? – suse

+0

@suse :'protocol_A' 헤더가 프로토콜을 확장한다면'protocol_B'와'protocol_C' 헤더를 가져와야합니다. – dreamlax

0

귀하의 protocol_A.h 파일 protocol_Bprotocol_C 준수를 선언, 아직 당신은 protocol_Bprotocol_C의 헤더를 가져 오지 않은. 이는 컴파일러와 관련하여 protocol_A.h에없는 프로토콜에 대한 적합성을 선언한다는 의미입니다.

protocol_A.h 에서 :

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import "protocol_B.h" //note these new imports 
#import "protocol_C.h" 

@protocol protocol_A <protocol_B, protocol_C> 
-(void)methodinA; 
@end 
+0

안녕하세요. 오류 : 예상 식별자 또는 '('앞에 '{'토큰 *** 세 번, 관련 메시지 ... – suse

+0

당신은'MyClass.m'에 오타가 있습니다.'@ impelemntation'은'@explication'이어야합니다. –

+0

안녕하세요 .. 아뇨 .. 내 코드에서이 포럼의 코드에서 오타가 잘못되었습니다. – suse

0

위임자, 프로토콜 및 선택기에 대해 설명하는 Apple의 Communicating with Objects도 참조하십시오. Mac OS X에 등록되어 있지만 대부분 (전부는 아님)도 iOS에도 적용되는 것으로 보입니다.