реализация @protocol в @interface в Objective-C - PullRequest
0 голосов
/ 11 февраля 2010

Мне нужно разработать приложение, которое имеет интерфейс, который реализует методы из 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'.

Плз Скажите, как решить эту проблему ??

Ответы [ 4 ]

2 голосов
/ 11 февраля 2010

Итак, откуда вы получаете это (и причина, по которой вы получаете это 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, поскольку он часто дает много удобных вещей. Вот содержание нового объявления protocol_D, нового из Xcode:

#import <Cocoa/Cocoa.h>

@protocol protocol_D


@end

Надеюсь, это поможет!

TL; DR: в определениях протоколов нигде не должно быть фигурных скобок.

0 голосов
/ 25 марта 2011

Также см. Apple Общение с объектами , в которой рассматриваются делегаты, протоколы и селекторы. Несмотря на то, что он указан в Mac OS X, большинство (если не все), похоже, применимо и к iOS.

0 голосов
/ 11 февраля 2010

Ваш файл protocol_A.h декларирует соответствие protocol_B и protocol_C, но вы еще не импортировали заголовки для protocol_B и protocol_C. Это означает, что вы заявляете о соответствии протоколам, которые в том, что касается компилятора, не существуют в protocol_A.h. Вам необходимо импортировать заголовки:

In 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 голосов
/ 11 февраля 2010

Протоколы обычно идут в файле .h; всегда идите в файл .h, если вы планируете использовать их где-либо.

Как и все остальное, вам необходимо #import .h файл, который содержит определение протокола, прежде чем использовать его.

Итак, в MyClass.h (он действительно должен быть написан заглавными буквами - классы всегда пишутся с заглавной буквы в Objective-C), #import различных файлов протокола .h.

...