2010-07-25 11 views
5

Ho una classe controller di visualizzazione (MyViewController) che si occupa di una sottoclasse UIView (MyView). Non voglio consentire a nessuna classe tranne la classe del controller di visualizzazione di conoscere la sottoclasse UIView, quindi non è possibile importare MyView.h in MyViewController.h.Protocolli "privati" Objective-C?

Così, in MyViewController.m, ho messo

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

@interface MyViewController (PrivateObjects) 

MyView *myView; 

@end 

... 

Tuttavia, per ottenere un feedback da MyView, io uso un delegato. Quel delegato deve implementare il protocollo MyViewDelegate.

Come posso implementare il protocollo MyViewDelegate all'interno MyViewController senza dover #importMyView.h in MyViewController.h?

risposta

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

0

Creare un protocollo (.h) al di fuori di MyView.h e l'uso che nella dichiarazione ( .h) di MyViewController, ad esempio:

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

--Frank

+0

Che cosa succede se il delegato contiene un metodo '(a proposito, non si può dichiarare una nuova Ivar in una categoria.) - (void) myView : (MyView *) myView textDidChange: (NSString *) text'? – ryyst

2

Puoi utilizzare una dichiarazione forware in MyViewController.h

@class MyView; 

@interface MyViewController { 
    MyView *myView; 
} 

@end 
-4

Perché si desidera utilizzare un protocollo? Basta inserire i metodi nella categoria PrivateObjects.

Edit: Apple si riferisce a questa tecnica come "informal protocol"

+0

Perché "solo mettere i metodi lì" è uno stile di programmazione scadente, in più "MyView" dovrebbe essere riusabile, quindi un delegato è sicuramente utile qui. – ryyst

+0

Aha, sembra che abbia frainteso "Non voglio permettere a nessuna classe tranne la classe del controller di visualizzazione di conoscere la sottoclasse UIView" – user123444555621

1

So che il mio suono strano, ma per esperienza posso dirvi di non si preoccupano tanto di gerarchie privacy in Cocoa.

Quindi in un'app o in framework interni è sufficiente documentare la classe indicando come dovrebbe essere utilizzata.

Questo perché non si può avere una vera privacy per quanto siano lunghi i puntatori C in modo che Objective-C sia stato progettato senza sintassi che potrebbe darvi solo qualche illusione.

Ad esempio le variabili di uscita IB del controller di vista devono tipicamente essere accessibili solo dal regolatore stesso, ma sono sempre pubbliche, perché devono essere accessibili dalle classi che disarchiviare ed istanziare le file pennino e collegare le prese con il istanze corrispondenti.

[compresi suggerimenti da bbum sotto]

+0

Non è che la lingua sia inadeguata nel suo supporto per implementazioni private, è molto che il linguaggio è progettato per * non * sprecare la sintassi sulla creazione dell'illusione della privacy, che è tutto ciò che avresti in un linguaggio basato su C comunque. – bbum