2011-05-24 16 views
14

¿iOS permite que el desarrollador defina un IBOutlet privado? Por ejemplo, hay varios botones en un viewController, y quiero hacer algo con estos botones tanto en el constructor de interfaz como en el código. Sin embargo, no quiero que otra clase tenga acceso a estos botones. ¿Puedo definir algunos IBOutlets "privadas" de estos botones¿Podemos definir un IBOutlet privado?

ejemplo de código:

@interface myViewController : UIViewController< 
{ 
@private: 
    UIButton *o_Button1; 
    UIButton *o_Button2; 
} 

//Can I have these outlets as private??? 
@property (nonatomic, retain) IBOutlet UIButton *Button1; 
@property (nonatomic, retain) IBOutlet UIButton *Button2; 

@end 

========================= ================================

Acaba de obtener una solución. Desearía que te ayudara

Combine las ideas de Abizern y JustSid, tengo una solución como esta.

en el archivo .h

@interface myViewController : UIViewController 
    { 
    @private 
     IBOutlet UIButton *Button1; 
     IBOutlet UIButton *Button2; 
    } 

    @end 

y en el archivo .m

@interface MyViewController() 

    @property (nonatomic, retain) UIButton *Button1; 
    @property (nonatomic, retain) UIButton *Button2; 

    @end 
    ... 
    @synthesize Button1, Button2; 

Gracias por la ayuda de Abizern y JustSid

+0

Supongo que si no establece '@ property' y' @ synthesize' para los objetos, no se puede acceder fuera de la clase ... – visakh7

+0

¡No funciona! Mi código: https://notepad.pw/4vmcjyr1. Estoy usando guiones gráficos. Cuando subclases esta clase de controlador de vista y la uso. Cambia los valores de ambas propiedades de xib. :( –

Respuesta

8

Añadir las propiedades en una categoría en la parte superior del archivo .m:

@interface MyViewController() 

@property (nonatomic, retain) IBOutlet UIButton *Button1; 
@property (nonatomic, retain) IBOutlet UIButton *Button2; 

@end 

De hecho, así es como se puede configurar como una propiedad de sólo lectura en el archivo .h y redeclare como una readwrite property en el archivo .m - para que pueda tener instaladores privados.

+2

Corrígeme si me equivoco, pero ¿esto no te daría una advertencia en Interface Builder (o el editor NIB en Xcode 4) ya que solo se ve en el archivo .h para IBOutlets declarados? –

+8

Un poco de consejo, no se moleste en hacer que sus propiedades/métodos sean privados a menos que esté desarrollando un marco/clase de código abierto, hace que la prueba/refactorización/desarrollo sea innecesariamente difícil. – kubi

+0

Daniel tiene razón. No puedo encontrar la salida de Button en Interface Builder. – JunC

4
@interface myViewController : UIViewController 
{ 
@private 
    IBOutlet UIButton *o_Button1; 
    IBOutlet UIButton *o_Button2; 
} 

@end 

Este código le permite tener la salida sin una propiedad a la que otros podrían acceder.

+0

Gracias JustSid, me da una gran ayuda. He combinado su solución con la de Abizern y la he publicado bajo la respuesta de Abizern. – JunC

+0

¡No funciona! :( –

4

La respuesta aceptada anteriormente tiene el problema de que IB no podrá ver los puntos de venta.

El enfoque que uso es crear un archivo llamado MyViewController-Protected.h y colocar la categoría con los IBOutlets privados allí. En su MyViewController.m incluye el -Protected.h en lugar del ordinario.

El archivo protegido podría tener este aspecto:

// MyViewController-Protected.h 
// Protected extensions to MyViewController 

#import "MyViewController.h" 

@interface MyViewController() 

@property (nonatomic, retain) IBOutlet UIButton *Button1; 
@property (nonatomic, retain) IBOutlet UIButton *Button2; 

@end 

IBOutlets definidos de esta manera son accesibles solamente a clases incluyendo el archivo de cabecera Protegida. Esta es solo la clase en general.

Una vez que la categoría está en un archivo de encabezado protegido, Interface Builder podrá encontrar los puntos de venta. (Para XCode3, debe arrastrar su archivo -Protected.h a IB, en Xcode4 funcionará de la caja).

Cuestiones relacionadas