Cocoa 无法从模型控制器对象写入NSTextField
在始终从AppController对象中运行单片代码块之后,我刚刚学会了如何使用单独的模型控制器对象对代码进行模块化(使用:-)更简洁、更容易混淆) 我的简单测试应用程序有一个主AppController和两个模型对象(Model1和Model2)。我可以成功地将数据从AppController传递到模型,模型本身可以运行方法并按照预期在“内部”处理传递的数据——但我无法让它们与UI中该死的NSTextField通信。以下是我的代码的相关部分: 在AppController.m#中导入“AppController.h” …在Model2.h中 #进口Cocoa 无法从模型控制器对象写入NSTextField,cocoa,user-interface,interface-builder,viewmodel,nstextfield,Cocoa,User Interface,Interface Builder,Viewmodel,Nstextfield,在始终从AppController对象中运行单片代码块之后,我刚刚学会了如何使用单独的模型控制器对象对代码进行模块化(使用:-)更简洁、更容易混淆) 我的简单测试应用程序有一个主AppController和两个模型对象(Model1和Model2)。我可以成功地将数据从AppController传递到模型,模型本身可以运行方法并按照预期在“内部”处理传递的数据——但我无法让它们与UI中该死的NSTextField通信。以下是我的代码的相关部分: 在AppController.m#中导入“AppC
@interface Model2 : NSObject
{
IBOutlet NSTextField *passedStringField;
}
- (id)initWithStuff:(NSString*)passedString :(int)passedNum;
@end
…最后是Model2.m
#导入“Model2.h”
这两个模型对象都有指向公共NSTextField的出口,我已经将控件从这两个对象拖动到该字段并将它们连接起来。我的AppController不知道NSTextField(我想,他甚至不想知道)。控制器对象和模型对象之间未建立IB连接
NSLog告诉我正在创建模型对象,并且传递的值使它变得如此之远。。。但不是从那里进入GUI窗口中的文本字段。我没有收到任何编译器错误或警告。我是否错过了某种“设定目标:”电话
如有任何帮助/想法,将不胜感激。谢谢:-)控制器位于模型和视图之间。模型不应与视图通信 控制器的工作应该是将任何传入值从视图传递到模型。然后,模型处理数据并发送回控制器,控制器随后用新数据更新视图 因此,在代码中,AppController中声明的TexField应该只有一个IBOutlet
考虑到所有这些,我不太清楚为什么文本字段没有被更新。从给定的代码来看,它应该是这样的。也许是multople Ibouts引起了一些问题?您可以尝试只使用一种型号的IBOutlet吗 除了mihirsm提到的缺少MVC之外,实际的问题是您试图使用
-init
方法访问插座
初始化对象时,不能保证连接插座
如果要设置声明为出口的NSTextField
的值,则应实现-awakeFromNib
,当nib已加载且所有出口都保证处于活动状态时调用该函数
在模型1.h中:
@interface Model1 : NSObject
{
IBOutlet NSTextField* passedStringField;
NSString* modelString;
}
- (id)initWithString:(NSString*)passedString number:(int)passedNum;
@end
@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];
}
在Model1.m中:
@interface Model1 : NSObject
{
IBOutlet NSTextField* passedStringField;
NSString* modelString;
}
- (id)initWithString:(NSString*)passedString number:(int)passedNum;
@end
@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];
}
@结束谢谢,米希姆。我只是刚刚开始模块化,所以我还没有100%地掌握模型-视图-控制器的概念。然而,我的测试几乎与苹果的“SimpleCoaApp”示例相同,它也使用了一个控制器和两个模型对象。控制器向任一模型发送一个字符串,模型(而不是控制器)将该字符串直接写入文本字段。它们的控制器没有连接到字段——只有两个模型对象连接(就像我正在做的那样)。唯一的区别是他们的演示通过“setTarget”发送,我使用“initWithStuff”(用于多个参数)。我还尝试了(1)只将一个模型连接到IBOutlet,(2)从两个模型中剥离出口,并将一个添加到控制器本身,(3)在textField上调用setFirstResponder,认为这可能是一个焦点问题,但不幸的是,还没有运气:-(阿德莱德的G'day,罗布:-)。是的,我现在得到了这个,非常感谢您的帮助。我刚刚被一个
-init
方法中的一个插座给逮住了。。谢谢你救了我。。