我需要开发一个应用程序,它有一个实现3个协议方法的接口。 假设协议A扩展了协议B和协议C,接口实现了协议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 :(得分: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; DR:协议定义不能在其中的任何位置使用大括号。
答案 1 :(得分:0)
协议通常放在.h文件中;如果您计划在任何地方使用它们,请始终使用.h文件。
就像其他所有内容一样,在使用之前,您需要#import
包含协议定义的.h文件。
因此,在MyClass.h中(它确实应该大写 - 类总是在Objective-C中大写),#import各种协议.h文件。
答案 2 :(得分:0)
您的protocol_A.h
文件声明符合protocol_B
和protocol_C
,但您尚未导入protocol_B
和protocol_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
答案 3 :(得分:0)
另请参阅Apple的Communicating with Objects,其中讨论了委托,协议和选择器。虽然它在Mac OS X下列出,但大多数(如果不是全部)似乎也适用于iOS。