2

在始终从我的 AppController 对象中运行单片代码块之后,我刚刚学会了如何使用单独的模型控制器对象来模块化我的代码(使用起来更整洁,更不容易混淆:-))

我的简单测试应用程序有一个主 AppController 和两个模型对象(Model1 和 Model2)。我可以成功地将数据从 AppController 传递给模型,并且模型本身可以运行方法并按照它们的意图“在内部”处理传递的数据——但我无法让它们与用户界面。这是我的代码的相关部分:

在 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:”电话?

任何帮助/想法将不胜感激。谢谢 :-)

4

2 回答 2

2

除了mihirsm提到的缺乏 MVC 之外,实际的问题是您试图访问-init方法中的出口。

初始化对象时,不能保证连接出口。

如果您想将NSTextField声明的值设置为插座,您应该实现-awakeFromNib,当 nib 已加载并保证所有插座都处于活动状态时调用它。

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

@结尾

于 2010-01-26T05:30:12.083 回答
1

控制器位于模型和视图之间。模型不应与视图通信。

将任何传入的值从视图传递给模型应该是控制器的工作。然后模型处理数据并发送回控制器,然后控制器用新数据更新视图。

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

鉴于这一切,我不确定为什么 TextField 没有被更新。从给定的代码看起来应该。也许多个 IBOutlets 引起了一些问题?您可以尝试仅使用一个具有 IBOutlet 的模型吗?

于 2010-01-26T02:08:18.283 回答