He creado una subclase de UIView y me gustaría que publique eventos personalizados que se muestran en Interface Builder (en realidad Xcode4) del mismo La forma en que los controles como UIButton tienen un montón de eventos en el área "Eventos enviados" cuando haces clic derecho en un control en el diseñador de Xcode 4. Sé que puedo usar la Delegación (a través de Protocolos) o la Notificación (a través del UINotificationCenter) para permitir que los objetos que utilizan mi vista personalizada sepan cuándo ocurren ciertas cosas, pero me gustaría saber si el "Mecanismo de acción del objetivo" (descrito en Cocoa Fundamentals Guide) es apropiado/deseable/posible de usar e integrar con el diseñador de Xcode. Procedente de un fondo principalmente .NET, este enfoque parece estar estrechamente relacionado con el modelo de eventos .NET y tiene más sentido para mí.Agregar mi propio evento a "Eventos enviados" en el menú del Interface Builder para mi UIView personalizado
Respuesta
Hay UIControlEventApplicationReserved, que le ofrece una gama de identificadores de eventos que su aplicación puede usar. Sin embargo, no creo que haya ninguna forma de decirle a Interface Builder acerca de los eventos definidos por la aplicación, por lo que no obtendrás el mismo soporte para tus eventos en IB como lo haces para los eventos estándar de UIControl. En cambio, deberá especificar el objetivo y la acción para cada evento definido en la aplicación en el código. (Por favor, alguien me corrige si me equivoco en este punto.) Eso no es para nada difícil, pero es un poco diferente.
Una forma simple de hacerlo es ampliar UIControl
en lugar de UIView
, esto le permitirá agregar un objetivo a todos los eventos predeterminados (igual que UIButton
, etc.).
Nota: para que mi UIControl
personalizado maneje los eventos en lugar de los controles que superé en capas, tuve que asegurarme de que userInteractionEnabled = NO
se estableciera en todos los controles en capas.
Puede hacerlo utilizando una IBOutletCollection. La ventaja de este enfoque es que puede vincular objetos en Interface Builder. El inconveniente es que no puede vincular directamente a IBActions (como UIControl). Aquí es una aplicación limpia utilizando un protocolo:
ObserverProtocol.h
@protocol ObserverProtocol <NSObject>
- (void)observedObjectChanged:(id)sender;
@end
MyObject.h
@interface MyObject : NSObject
{
@private
IBOutletCollection(id<ObserverProtocol>) NSArray *observers;
}
- (void)objectChanged;
MyObject.m
@implementation MyObject
- (void)objectChanged
{
for (id<ObserverProtocol> observer in observers)
{
if ([observer respondsToSelector:@selector(observedObjectChanged:)])
{
[observer observedObjectChanged:self];
}
}
}
@end
Entonces sólo tiene que poner en práctica ObserverProtocol en las clases que desea observar el evento (y para hacer el enlace en Interface Builder, por supuesto).
- 1. UIView personalizado creado con Interface Builder accesible/posicionable a través de Interface Builder
- 2. ¿Dónde inicializar UIView personalizado, instanciado en Interface Builder?
- 3. Implementación de eventos en mi propio objeto
- 4. Eventos para UIView personalizado
- 5. Apple Interface Builder: agregar subvista a UIImageView
- 6. ¿Cómo puedo agregar un Objeto personalizado en Interface Builder?
- 7. Actualizar clase UIView en Interface Builder
- 8. Cómo agregar MKUserTrackingBarButtonItem en Interface Builder
- 9. Cómo cambiar el tamaño de UIView en Interface Builder
- 10. Cómo usar UITableViewCell personalizado desde Interface Builder?
- 11. ¿Cómo creo mi propio formato ToString() personalizado?
- 12. Erlang: gen_server o mi propio servidor personalizado?
- 13. iPhone - ¿Crear objetos personalizados para Interface Builder?
- 14. Usando Interface Builder para UITableViews
- 15. Agregar mi propio atributo de descripción a un Pandas DataFrame
- 16. ¿Cómo puedo agregar mi formulario personalizado al bloque personalizado en mi módulo personalizado
- 17. ¿Cómo hacer mi propio marcador personalizado en un teléfono Android
- 18. UIView personalizado desde el Creador de interfaces
- 19. ¿Cómo creo mi propio grupo personalizado en mediawiki?
- 20. Interface Builder UIDatePicker
- 21. advertencias Interface Builder
- 22. La diferenciación entre los eventos provocados por la interacción del usuario y mi propio código
- 23. Desarrollando mi propio CMS
- 24. Escribiendo mi propio método de bloqueo
- 25. Imágenes en Interface Builder al usar MonoTouch
- 26. ¿Cómo agregar agregar iconos e Intenciones en el menú QuickContactBadge para mi programa de Android?
- 27. file_get_contents() conexión rechazada para mi propio sitio
- 28. iPhone Interface Builder y Delegados
- 29. ¿Cómo puedo crear mi propio archivo vsdoc.js para mi JavaScript?
- 30. JavaScript Boolean Search Query Builder Interface Library?
Ah, OK. Tener que proporcionar el "objetivo" parece mucho más desordenado que simplemente configurar un delegado, aunque supongo que podría hacer que mi UIView personalizado lo tomara (a través de una propiedad o método) como un NSObject para que mi vista no tuviera que incluir encabezados. para objetos que se encuentran más arriba en la jerarquía de aplicaciones y que están estrechamente relacionados. Mi suposición es que esto es lo que sucede al hacer una conexión en el diseñador, por lo que es probablemente lo mismo. Parece que el método estándar o quizás preferible es simplemente usar Delegación. No pude encontrar mucha información sobre el "Mecanismo de acción objetivo" antes mencionado. – dreyln
Son ideas muy similares. Un controlador de vista suele ser el objetivo y/o delegado de las vistas y controles que administra. En ese caso, simplemente pasaría 'self' como el objetivo y uno de sus selectores como la acción en una llamada a '-addTarget: action: forControlEvents:'. – Caleb