No se puede escribir en NSTextField de Controlador de Modelo de objetos
-
22-09-2019 - |
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 :-)
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?