2010-07-25 16 views
5

Obtuve una clase controladora de vista (MyViewController) que trata con una subclase UIView (MyView). No quiero permitir que ninguna clase excepto la clase controladora de vista conozca la subclase UIView, por lo que no puedo importar MyView.h en MyViewController.h.Objective-C protocolos "privados"?

Así, en MyViewController.m, puse

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

@interface MyViewController (PrivateObjects) 

MyView *myView; 

@end 

... 

Sin embargo, para obtener retroalimentación de MyView, utilizo un delegado. Ese delegado tiene que implementar el protocolo MyViewDelegate.

¿Cómo puedo implementar el protocolo MyViewDelegate dentro MyViewController sin tener que #importMyView.h en MyViewController.h?

Respuesta

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

0

Crear un protocolo (.h) fuera de MyView.h y el uso que en la declaración ( .h) de MyViewController, por ejemplo:

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

--Frank

+0

¿Qué pasa si el delegado contiene un método '(Por cierto, no se puede declarar un nuevo Ivar en una categoría.) - (void) myView : (MyView *) myView textDidChange: (NSString *) text'? – ryyst

2

Puede use un Forware-declaración en MyViewController.h

@class MyView; 

@interface MyViewController { 
    MyView *myView; 
} 

@end 
-4

¿por qué te desea utilizar un protocolo? Simplemente ponga los métodos en su categoría PrivateObjects.

Editar: Apple se refiere a esta técnica como "informal protocol"

+0

Porque "simplemente poner los métodos allí" es un mal estilo de programación, además de que 'MyView' debe ser reutilizable, por lo que un delegado definitivamente es útil aquí. – ryyst

+0

Aha, parece que no entendí "No quiero dejar que ninguna clase excepto la clase de controlador de vista conozcan la subclase de UIView" – user123444555621

1

Sé que mi sonido extraño, pero la experiencia te puedo decir que no se molestan mucho acerca de las jerarquías de privacidad en Cocoa.

Por lo tanto, en una aplicación o en marcos internos simplemente documente la clase indicando cómo debe usarse.

Esto se debe a que no se puede tener una privacidad real a medida que los punteros C están alrededor, por lo que Objective-C se diseñó sin sintaxis que solo le daría alguna ilusión. Por ejemplo, las variables de salida IB de los controladores de vista normalmente solo deben ser accesibles por el controlador, pero siempre son públicas, ya que deben ser accesibles desde las clases que desarchivan e instancian los archivos nib y vinculan los puntos de venta con los archivos instancias correspondientes.

[incluyendo sugerencias de bbum abajo]

+0

No es que el lenguaje sea inadecuado en su soporte para implementaciones privadas, es mucho más que eso el lenguaje está diseñado para * no * desperdiciar la sintaxis al crear la ilusión de privacidad, que es todo lo que tendrías en un lenguaje basado en C de todos modos. – bbum