Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 无法从模型控制器对象写入NSTextField_Cocoa_User Interface_Interface Builder_Viewmodel_Nstextfield - Fatal编程技术网

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

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

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

我的简单测试应用程序有一个主AppController和两个模型对象(Model1和Model2)。我可以成功地将数据从AppController传递到模型,模型本身可以运行方法并按照预期在“内部”处理传递的数据——但我无法让它们与UI中该死的NSTextField通信。以下是我的代码的相关部分:

在AppController.m#中导入“AppController.h”

…在Model2.h中 #进口

@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
方法中的一个插座给逮住了。。谢谢你救了我。。