Pregunta

Después de ejecuta siempre monolítico bloques de código dentro de mi AppController objeto, sólo he aprendido a modularizar el código de usar el modelo de objetos del controlador (mucho más limpio y menos confuso para trabajar :-))

Mi prueba sencilla aplicación tiene un principal de AppController y dos del modelo de objetos (Model1 y Model2).Me pueden pasar con éxito los datos de la AppController a las modelos y los modelos en sí mismos pueden ejecutar los métodos y proceso de los datos transmitidos 'internamente' tal y como se pretendía hacer, pero no puedo llegar a comunicarse con un maldito NSTextField en la interfaz de usuario.He aquí las partes relevantes de mi código:

En AppController.m #import "AppController.h"

@implementation AppController

- (IBAction)passObjectsToModelController:(id)sender
{
NSString *stringToPass = @"Hello from Model2 :-)";
int numToPass=12345;

Model2 *ObjController2 = [[Model2 alloc]initWithStuff:stringToPass:numToPass];
    [ObjController2 release];
}

@end

...en Model2.h #import

@interface Model2 : NSObject
{
IBOutlet NSTextField *passedStringField;
}
- (id)initWithStuff:(NSString*)passedString :(int)passedNum;

@end

...y, finalmente, en Model2.m #import "Model2.h"

@implementation Model2

- (id)initWithStuff:(NSString*)passedString :(int)passedNum
{
if(self = [super init])
    {
    NSLog(@"now inside 'Model2' controller...");
    NSLog(@"the passed string reads: %@",passedString); //••• this works •••
    NSLog(@"the passed number is:%d",passedNum); //••• this works •••

    [passedStringField setStringValue:passedString]; //••• WTF!!... this DOESN'T work! •••
    // do something internally with passedNum here...
    }
return self;
}

@end

Tanto el modelo de objetos de comunicación para el común NSTextField y he de control-que se arrastra desde ambos objetos al campo y conectados a ellos.Mi AppController no saber sobre el NSTextField (y supongo, no quieren saber).No IB se han realizado las conexiones entre el objeto controlador y el modelo de objetos.

NSLog me dice que el modelo de objetos se crean, y que los valores pasados son lo que hace que sea mucho...pero no, desde allí, en el campo de texto en la ventana de la GUI.No estoy recibiendo ningún compilador de errores o advertencias.Me estoy perdiendo algún tipo de " setTarget:' call tal vez?

Cualquier ayuda/ideas sería muy apreciada.Gracias :-)

¿Fue útil?

Solución

Aparte de la falta de MVC que mihirsm menciona, el problema real es que estás intentando acceder a una toma de corriente en un -init método.

Cuando un objeto se inicializa, puntos de venta no están garantizados para ser conectado.

Si desea establecer el valor de un NSTextField declarada como una toma de corriente, debe implementar -awakeFromNib, la que se llama cuando la punta se ha cargado y que todas las salidas están garantizados para estar vivo.

en Model1.h:

@interface Model1 : NSObject
{
    IBOutlet NSTextField* passedStringField;
    NSString* modelString;
}
- (id)initWithString:(NSString*)passedString number:(int)passedNum;
@end

en Model1.m:

@implementation Model1
- (id)initWithString:(NSString*)passedString number:(int)passedNum
{
if(self = [super init])
    {
    //copy the string to our ivar
    modelString = [passedString copy];
    }
return self;
}

//awakeFromNib is called when our outlet is live
- (void)awakeFromNib
{
    [passedStringField setStringValue:modelString];
}

//don't forget to release the string, because we created it using -copy
- (void)dealloc
{
    [modelString release];
}

@end

Otros consejos

El Controlador se encuentra entre el Modelo y la Vista.El Modelo no debe comunicarse con la Vista.

Debe ser el trabajo de un Controlador para pasar los valores desde el punto de Vista del Modelo.El Modelo a continuación, procesa los datos y los envía al Controlador de que, a continuación, actualiza la Vista con los nuevos datos.

Así, en el código solo debe haber un IBOutlet para la TexField declarado en el AppController.

Teniendo en cuenta todo esto, no estoy exactamente seguro de por qué el campo de texto no está siendo actualizado.Desde el código dado, parece que debería.Tal vez multople IBOutlets están causando algún problema?Puedes intentar con sólo un Modelo a tener la IBOutlet?

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