2010-02-11 5 views
0

J'ai besoin de développer une application qui a une interface qui implémente les méthodes de 3 protocoles. Supposons que le protocole A étend le protocole B et protocole C, et l'interface implémente le protocole A. Voici comment mon code ressemble,@protocole implémentation dans @interface dans Objective-C

// 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 

je reçois une exception, et mon application est écrasé ... se

***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 Comment ça marche?

+0

Le plantage est totalement indépendant des protocoles. Posez une question différente Je parie que vous avez une liaison 'fenêtre' dans Interface Builder? – bbum

Répondre

2

Alors, où vous obtenez ce à partir (et la raison pour laquelle vous obtenez 3 fois) est que vous avez une erreur dans vos définitions de protocole. Vous avez:

//This is in protocol_C.h file 

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

Vous ne pouvez pas déclarer les membres de la classe dans un protocole: seules les méthodes. Pour cette raison, vous n'avez pas besoin (et, comme vous l'avez découvert) ne peut pas avoir les accolades dans la définition de protocole. En tant que tel, vous en avez besoin pour vos définitions de protocole:

//This is in protocol_C.h file 

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

-(void)methodinC; 

@end 

Enlever ceux qui devraient résoudre votre problème.

Lors de la création de nouveaux fichiers, je passe toujours par le processus de création de nouveaux fichiers Xcode, car il vous donne souvent beaucoup de choses pratiques. Voici le contenu d'une nouvelle déclaration protocol_D fraîche de Xcode:

#import <Cocoa/Cocoa.h> 

@protocol protocol_D 


@end 

Espérons que cela aide! TL; DR: Les définitions de protocole ne peuvent avoir d'accolades nulle part dans celles-ci.

+0

Hey .. super !!! merci ... :) je reçois cette Exception concernant, *** Application terminaison due à une exception non interceptée 'NSUnknownKeyException', raison: '[ setValue: forUndefinedKey:]: cette classe n'est pas une valeur clé coding-complia nt pour la fenêtre clé. ' – suse

+0

Vous aurez besoin de poster votre code actuel pour essayer de résoudre ce problème. Pourriez-vous copier et coller le message d'erreur exact que vous voyez également? – CajunLuke

+0

ci-dessus ce que j'ai écrit est le codem réel et aussi j'ai copier - n - collé la même erreur – suse

0

Les protocoles vont généralement dans un fichier .h; toujours aller dans un fichier .h si vous prévoyez de les utiliser n'importe où.

Comme tout le reste, vous devez #import le fichier .h qui contient la définition du protocole avant de l'utiliser. Donc, dans MyClass.h (il faut vraiment le mettre en majuscule - Les classes sont toujours en majuscules dans Objective-C), #importer les différents fichiers de protocole .h.

+0

Salut, ... J'ai modifié mon code ci-dessus, j'ai fait #import dans le fichier MyClass.h., puisque tat est le seul protocole que j'implémente dans MyClass, car à l'intérieur il étend d'autres protocol_B et protocol_C, je vais définir toutes les méthodes dans MyClass. je ne suis pas capable de savoir ce que l'erreur ,. plz help .. – suse

+0

Devrais-je importer protocol_B et protocol_C aussi dans MyClass.h ?? – suse

+0

@suse: Votre en-tête 'protocol_A' devrait importer les en-têtes' protocol_B' et 'protocol_C' s'il étend ces protocoles. – dreamlax

0

Votre fichier protocol_A.h déclare la conformité à protocol_B et protocol_C, mais vous n'avez pas importé les en-têtes pour protocol_B et protocol_C. Cela signifie que vous déclarez la conformité aux protocoles qui, en ce qui concerne le compilateur, n'existent pas dans protocol_A.h. Vous devez importer les en-têtes:

En 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

hey merci ... mais stil je reçois *** ERREUR: Identificateur attendu ou '(' avant '' '' jeton *** trois fois, whats c'est lié à ... – suse

+0

Vous avez une faute de frappe dans 'MyClass.m',' @ impelemntation' devrait être '@ implementation'. –

+0

hey .. non .. dans mon code son propre .. c'est seulement une faute de frappe dans le code dans ce forum – suse

0

Voir aussi Communicating with Objects d'Apple, qui traite des délégués, des protocoles et des sélecteurs. Bien qu'il soit répertorié sous Mac OS X, la plupart (sinon la totalité) semble s'appliquer également à iOS.

Questions connexes