Невозможно записать в NSTextField из объекта Model Controller - PullRequest
2 голосов
/ 26 января 2010

После того, как я всегда выполнял монолитные блоки кода из моего объекта AppController, я только что узнал, как модулировать мой код, используя отдельные объекты контроллера модели (так гораздо удобнее и менее запутанно работать с: -))

В моем простом тестовом приложении есть основной AppController и два объекта модели (Model1 и Model2). Я могу успешно передавать данные из AppController в модели, а сами модели могут запускать методы и обрабатывать переданные данные «внутренне», как и предполагалось, - но я не могу заставить их общаться с заштрихованным NSTextField в UI. Вот соответствующие части моего кода:

В 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

... в Model2.h #import

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

@end

... и, наконец, в 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

Оба объекта модели имеют выходы к общему NSTextField, и я перетащил элемент управления из обоих объектов в поле и подключил их. Мой AppController не не знает о NSTextField (и я полагаю, даже не хочет знать). Соединения IB между объектом контроллера и объектами модели не установлены.

NSLog говорит мне, что объекты модели создаются, и что переданные значения делают это так далеко ... но не оттуда в текстовое поле в окне GUI. Я не получаю никаких ошибок или предупреждений компилятора. Возможно, мне не хватает какого-то вызова setTarget:

Любая помощь / идеи будут высоко ценится. Спасибо: -)

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Помимо отсутствия MVC, о котором упоминает mihirsm , проблема в том, что вы пытаетесь получить доступ к розетке методом -init.

При инициализации объекта подключение к розетке не гарантируется.

Если вы хотите установить значение NSTextField, объявленного как розетка, вы должны реализовать -awakeFromNib, который вызывается, когда перо загружено и все розетки гарантированно будут работать.

in Model1.h :

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

в 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];
}

@ конец

1 голос
/ 26 января 2010

Контроллер находится между моделью и видом. Модель не должна общаться с View.

Контроллер должен передавать любые входящие значения из представления в модель. Затем модель обрабатывает данные и отправляет их обратно в контроллер, который затем обновляет представление новыми данными.

Итак, в вашем коде у вас должен быть только один IBOutlet для TexField, объявленного в AppController.

Учитывая все это, я не совсем уверен, почему TextField не обновляется. Из приведенного кода выглядит так, как должно. Может быть, несколько IBOutlets вызывают некоторые проблемы? Можете ли вы попробовать только с одной моделью, имеющей IBOutlet?

...