在我的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:”调用?
非常感谢任何帮助/想法。谢谢: - )
答案 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的模型吗?