Pregunta

Estoy creando un proyecto simple para iPhone, usando Xcode y Interface Builder. Si bien entiendo qué es un delegado, tengo un problema con su uso.

Tengo un UITextField en mi interfaz. Muestra el teclado cuando el usuario toca, pero necesito programar manualmente cómo ocultar el teclado. Se puede hacer con delegados. Entonces, en IB, tomo Object de la biblioteca, le doy el nombre de clase como Control1Delegate y luego conecto la salida de delegado de mi campo de texto para que sea este Control1Delegate. También tengo archivos .my .h para esta clase Control1Delegate:

Control1Delegate.h

@interface Control1Delegate : NSObject <UITextFieldDelegate> {
}

- (BOOL) textFieldShouldReturn:(UITextField *)textField;

@end

Control1Delegate.m

#import "Control1Delegate.h"

@implementation Control1Delegate

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

@end

Pero esto no funciona. Cuando se ejecuta, nunca alcanza el método textFieldShouldReturn o se bloquea sin msg o con EXEC_BAD_ACCESS. Lo curioso es que cuando muevo el método al archivo del controlador (el que ha generado un asistente) y me conecto desde UITextField a este controlador (Propietario del archivo), todo funciona como se esperaba. Vi que la mayoría de los tutoriales de código de Apple colocan métodos delegados en objetos aleatorios en lugar de clases separadas; me gustaría saber por qué. ¿No puedo tener delegado en una clase separada?

¿Qué me estoy perdiendo aquí? ¿Algún puntero nulo? ¿Ciclo de vida del objeto?

¿Fue útil?

Solución

Su objeto Control1Delegate se destruye poco después de ser creado. Todos los objetos Nib de nivel superior deben conservarse si desea mantenerlos con vida. Consulte la Guía de programación de recursos: The Nib Object Ciclo de vida .

El propietario del archivo podría tener una propiedad como esta, para retener el objeto:

@property (nonatomic, retain) IBOutlet Control1Delegate *control1delegate;

Recuerde liberar el objeto después de que ya no sea necesario.

Otros consejos

Puede colocar métodos delegados en cualquier clase, incluida una creada solo para ese propósito. La razón por la que Apple (y otros programadores) generalmente no hacen clases específicamente para las funciones de delegado es que se vuelve demasiado complejo y difícil compartir datos. Por ejemplo, en uno de mis proyectos podría crear una subclase de Controlador de ventana que maneje métodos delegados desde la ventana, la vista de tabla dentro de la ventana y la barra de herramientas de la ventana. Todo lo que necesita para manipular y mantener el estado de esa ventana está en una clase de controlador. Ahora imagine tres clases separadas (más probablemente una clase de controlador para administrarlas) haciendo las mismas funciones: eso es mucho trabajo adicional sin beneficio real.

En cuanto a por qué está fallando, parece que está cometiendo un error con la administración de memoria en otro lugar de su aplicación. Puede usar el depurador para localizar exactamente de dónde viene.

Gracias a los dos. No solo ahora sé cómo resolver mi problema, sino que finalmente entendí cómo se retienen los objetos en el proceso de creación de Nib. No es suficiente crear un objeto en IB, si se trata de una entidad nueva, debe estar conectado a un ivar real en el Propietario del archivo (con getter / setter sintetizado correctamente).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top