@Objective-C中@接口的协议实现

@Objective-C中@接口的协议实现,objective-c,interface,protocols,Objective C,Interface,Protocols,我需要开发一个应用程序,它有一个接口,实现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 //T

我需要开发一个应用程序,它有一个接口,实现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
//这在MyClass.h文件中
#进口
#进口
#导入“协议A”
@接口MyClass:NSObject
{
}
@结束
//这是MyClass.m文件
#导入“MyClass.h”
@myClass的实现
-(无效)methodinA
{
NSLog(“我在协议A中”);
}
}
-(无效)方法b
{
NSLog(@“我在B方案中”);
}
-(无效)methodinC
{
NSLog(@“我在C协议中”);
}
@结束
//这是protocol_A.h文件
#进口
#进口
#导入“协议B.h”
#导入“协议C.h”
@协议A
-(无效)methodinA;
@结束
//这在protocol_B.h文件中
#进口
#进口
@协议
-(无效)方法B;
@结束
//这在protocol_C.h文件中
#进口
#进口
@协议
-(无效)methodinC;
@结束
我遇到了一个异常,我的应用程序崩溃了

***Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MyClass 0X323nm31>setvalue:forundefinedKey:]:this class is not key value coding-compilant for the key window'.
***由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setvalue:forundefinedKey:]:此类不是密钥窗口的密钥值编码编译器”。

请告诉我如何解决这个问题???

协议通常放在.h文件中;如果您打算在任何地方使用它们,请始终使用.h文件

与其他内容一样,在使用协议之前,需要导入包含协议定义的.h文件


因此,在MyClass.h中(它确实应该大写——类在Objective-C中总是大写),#导入各种protocol.h文件。

您的
协议A.h
文件声明符合
协议B
协议C
,但是您还没有导入
protocol\u B
protocol\u C
的标题。这意味着您正在声明与编译器所关心的协议的一致性,而这些协议在
协议\u A.h
中不存在。您需要导入标题:

协议中\u 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
#导入
#进口
#导入“protocol_B.h”//注意这些新导入
#导入“协议C.h”
@协议A
-(无效)methodinA;
@结束

因此,从何处获取此信息(以及获取3次的原因)是协议定义中存在错误。你有:

//This is in protocol_C.h file

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol protocol_C
{
}
-(void)methodinC;
@end
//这在protocol_C.h文件中
#进口
#进口
@协议
{
}
-(无效)methodinC;
@结束
不能在协议中声明类成员:只能声明方法。因此,您不需要(并且,正如您所发现的)在协议定义中不能有花括号。因此,您的协议定义需要:

//This is in protocol_C.h file

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

-(void)methodinC;

@end
//这在protocol_C.h文件中
#进口
#进口
@协议
-(无效)methodinC;
@结束
移除这些应该可以解决您的问题

在创建新文件时,我总是要经历Xcode的新类文件过程,因为它经常为您提供许多方便的东西。以下是新的Xcode协议声明的内容:

#import <Cocoa/Cocoa.h>

@protocol protocol_D


@end
#导入
@协议
@结束
希望这有帮助


TL;DR:协议定义中的任何地方都不能有花括号。

另请参见苹果的,其中讨论了委托、协议和选择器。虽然它列在Mac OS X下,但大多数(如果不是全部的话)似乎也适用于iOS。

hi,。。。我编辑了上面的代码,在MyClass.h文件中完成了导入,因为tat是我在MyClass中实现的唯一协议,因为它扩展了其他协议B和协议C,所以我将在MyClass中定义所有方法。我无法找出错误所在,。plz help..我是否也应该在MyClass中导入protocol_B和protocol_C。h???@suse:您的
protocol_A
头应该导入
protocol_B
protocol_C
头,如果它扩展了这些协议。嘿,谢谢。。我知道这是一个愚蠢的错误P但是我仍然得到了***错误:预期标识符或“(”在“{”令牌***之前三次,它与…?@bbum:协议中的方法可以有返回类型和参数传递吗?嘿,谢谢…但是我仍然得到***错误:预期标识符或“(”在之前){'token***三次,这与…?你在
MyClass.m
中有一个输入错误,
@implementation
应该是
@implementation
。嘿..不..在我的代码中它是正确的..这只是这个论坛中的一个代码输入错误。嘿..超级!!!谢谢...)我收到此异常,原因是,***由于未捕获的例外“NSUnknownKeyException”而终止应用程序,“[setValue:forUndefinedKey:]:此类不符合密钥窗口的键值编码。您需要发布实际代码来尝试解决此问题。您是否也可以复制并粘贴您看到的确切错误消息?我上面写的是实际代码,并且我已复制-粘贴了相同的错误。崩溃与协议完全无关。请询问其他问题我敢打赌你在界面生成器中有一个“窗口”绑定?