2010-07-25 4 views
5

J'ai obtenu une classe de contrôleur de vue (MyViewController) qui traite d'une sous-classe UIView (MyView). Je ne veux pas que toute classe à part la classe de contrôleur de vue soit au courant de la sous-classe UIView, donc je ne peux pas importer MyView.h dans MyViewController.h.Protocoles "privés" Objective-C?

Ainsi, dans MyViewController.m, je mets

#import "MyViewController.h" 
#import "MyView.h" 

@interface MyViewController (PrivateObjects) 

MyView *myView; 

@end 

... 

Cependant, pour obtenir des commentaires de MyView, j'utilise un délégué. Ce délégué doit implémenter le protocole MyViewDelegate.

Comment puis-je mettre en œuvre le protocole MyViewDelegate intérieur MyViewController sans avoir à #importMyView.h à MyViewController.h?

Répondre

14
@interface MyViewController (PrivateObjects) <MyViewDelegate> 
.... 

0

Créer un protocole (.h) en dehors de MyView.h et l'utiliser dans la déclaration ( .h) de MyViewController, par exemple:

#import "MyViewDelegate.h" 
@interface MyViewController : UIViewController <MyViewDelegate> 

--Frank

+0

si le délégué contient une méthode '(BTW, vous ne pouvez pas déclarer une nouvelle Ivar dans une catégorie.) - (void) myView : (MyView *) myView textDidChange: (NSString *) text'? – ryyst

2

Vous pouvez utiliser une déclaration forware dans MyViewController.h

@class MyView; 

@interface MyViewController { 
    MyView *myView; 
} 

@end 
-4

Pourquoi voulez-vous même utiliser un protocole? Il suffit de mettre les méthodes dans votre catégorie PrivateObjects.

Modifier: Apple fait référence à cette technique comme « informal protocol »

+0

Parce que "juste mettre les méthodes là" est mauvais style de programmation, plus 'MyView' devrait être réutilisable, donc un délégué est certainement utile ici. – ryyst

+0

Aha, on dirait que j'ai mal compris "Je ne veux pas que toute classe à part la classe de contrôleur de vue soit au courant de la sous-classe UIView" – user123444555621

1

Je sais que mon son étrange, mais par expérience, je peux vous dire de ne se soucient pas tant sur les hiérarchies de la vie privée dans le cacao. Ainsi, dans une application ou dans des cadres internes, documentez simplement la classe en indiquant comment elle doit être utilisée. C'est parce que vous ne pouvez pas avoir une vraie vie privée car les pointeurs C longs sont autour de sorte que Objective-C a été conçu sans syntaxe qui ne vous donnerait que quelques illusions. Par exemple, les variables de sortie IB des contrôleurs de vue ne doivent généralement être accessibles que par le contrôleur lui-même, mais elles sont toujours publiques, car elles doivent être accessibles depuis les classes qui désarchivent et instancient les fichiers nib et relient les prises instances correspondantes.

[y compris des suggestions de bbum ci-dessous]

+0

Ce n'est pas que le langage soit inadéquat dans son implémentation privée, c'est très le langage est conçu pour * pas * gâcher la syntaxe sur la création de l'illusion de la vie privée, qui est tout ce que vous auriez dans une langue basée sur C de toute façon. – bbum