无法从模型控制器对象写入NSTextField

时间:2010-01-26 01:59:32

标签: cocoa user-interface interface-builder viewmodel nstextfield

在我的AppController对象中始终运行单片代码块后,我刚刚学会了如何使用单独的模型控制器对象模块化我的代码(这么多整洁,使用起来不那么混乱: - )

我的简单测试应用程序有一个主AppController和两个模型对象(Model1和Model2)。我可以成功地将数据从AppController传递给模型,模型本身可以运行方法并按照预期的方式“内部”处理传递的数据 - 但是我无法让它们与darned 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 个答案:

答案 0 :(得分:2)

除了 mihirsm 提到的MVC缺乏之外,实际问题是您尝试使用-init方法访问插座。

初始化对象时,不保证连接插座。

如果要设置声明为插座的NSTextField的值,则应实现-awakeFromNib,这在加载笔尖并确保所有插座都处于活动状态时调用。 / p> 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];
}

@end

答案 1 :(得分:1)

Controller位于Model和View之间。模型不应与View通信。

Controller的工作应该是将任何传入的值从View传递给Model。然后,Model处理数据并发送回Controller,然后Controller使用新数据更新View。

因此,在您的代码中,您应该只有一个IBOutlet用于在AppController中声明的TexField。

鉴于这一切,我不确定为什么TextField没有更新。从给定的代码看起来应该如此。也许多人IBOutlets造成了一些问题?你能尝试只有一个拥有IBOutlet的模型吗?