iphone - usar - serialización en netbeans
¿Técnica correcta para escribir objetos de interfaz reutilizables? (2)
El delegado definitivamente es el camino a seguir aquí.
Estoy buscando la forma correcta de escribir mis propios objetos de interfaz.
Diga, quiero una imagen que se pueda tocar dos veces.
@interface DoubleTapButtonView : UIView {
UILabel *text;
UIImage *button;
UIImage *button_selected;
BOOL selected;
}
// detect tapCount == 2
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
Esto funciona bien: el botón recibe los eventos y puede detectar dos toques.
Mi pregunta es cómo manejar las acciones de manera limpia. Los dos enfoques que he probado son agregar referencias al objeto principal y a la delegación.
Pasar una referencia al objeto principal es bastante sencillo ...
@interface DoubleTapButtonView : UIView {
UILabel *text;
UIImage *button;
UIImage *button_selected;
BOOL selected;
MainViewController *parentView; // added
}
@property (nonatomic,retain) MainViewController *parentView; // added
// parentView would be assigned during init...
- (id)initWithFrame:(CGRect)frame
ViewController:(MainViewController *)aController;
- (id)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
Pero esto evitaría que mi clase DoubleTapButtonView se agregue fácilmente a otras vistas y controladores de vista.
La delegación agrega algo de abstracción adicional al código, pero me permite usar DoubleTapButtonView en cualquier clase que se ajuste a la interfaz de delegado.
@interface DoubleTapButtonView : UIView {
UILabel *text;
UIImage *button;
UIImage *button_selected;
BOOL selected;
id <DoubleTapViewDelegate> delegate;
}
@property (nonatomic,assign) id <DoubleTapViewDelegate> delegate;
@protocol DoubleTapViewDelegate <NSObject>
@required
- (void)doubleTapReceived:(DoubleTapView *)target;
Esta parece ser la forma correcta de diseñar los objetos. El botón solo sabe si fue duplicado, y luego le dice al delegado quién decide cómo manejar esta información.
Me pregunto si hay otras formas de pensar sobre este problema. Noté que UIButton usa UIController y addTarget: para administrar eventos de envío. ¿Es conveniente aprovechar este sistema al escribir mis propios objetos de interfaz?
Actualización: Otra técnica es usar NSNotificationCenter para crear observadores para varios eventos y luego crear el evento en el botón.
// listen for the event in the parent object (viewController, etc)
[[NSNotificationCenter defaultCenter]
addObserver:self selector:@selector(DoubleTapped:)
name:@"DoubleTapNotification" object:nil];
// in DoubleTapButton, fire off a notification...
[[NSNotificationCenter defaultCenter]
postNotificationName:@"DoubleTapNotification" object:self];
¿Cuáles son las desventajas de este enfoque? ¿Menos control en tiempo de compilación y posible código de spaghetti con eventos que vuelan fuera de la estructura del objeto? (e incluso colisión del espacio de nombres si dos desarrolladores usan el mismo nombre de evento?)
O subclase UIControl
y use -sendActionsForControlEvents:
La principal ventaja de esto son los objetivos múltiples para acciones particulares ... en este caso, por supuesto, solo tienes doble toque, pero creo que es la mejor manera de hacerlo en general.