0

主要思想:

模型:将值设置为textfield我可以调用/记录的变量。

观点:只是一个NSTextField迷上了Model班级。

控制器:NSButton连接到ViewController.

你会注意到,它记录了来自 NSLog 的基本字符串,也是预定义的begin值。但是当我要求txtBegin它返回的值时NULL

我知道TextFieldButton连接在连接检查器中。

截屏:

在此处输入图像描述

可下载项目:

视图控制器.h

#import <Cocoa/Cocoa.h>
#import "Model.h"
@interface ViewController : NSView
- (IBAction)logTheVariable:(id)sender;

@end

视图控制器.m

    - (IBAction)logTheVariable:(id)sender 
{
        Model *myModel = [[Model alloc]init];
        [myModel doSomething];
}

模型.h

#import <Foundation/Foundation.h>

@interface Model : NSObject{
//iVars
    int begin;
}
//properties
@property (weak) IBOutlet NSTextField *txtBegin;

//methods
-(void)doSomething;

@end

模型.m

#import "Model.h"

@implementation Model

    -(void)doSomething{
        NSLog(@"I'm in the Model Class"); //logs like a charm!
        begin = 5; //just a test to see if it logs anything (which works)
        NSLog(@"%d",begin);// logs like a charm!
        //->Problem is here <-
        NSLog(@"%@",_txtBegin.stringValue); //returns a "NULL" value.
        //->Problem is here <-
    }
    @end
4

2 回答 2

1

您使用的 Model 类实例logTheVariable:正在记录一个空值,因为它是您在 ViewController 的操作中创建的新实例,而不是 Model 接口构建器知道的实例。

- (IBAction)logTheVariable:(id)sender 
{
    Model *myModel = [[Model alloc]init];
    //This is a new instance. The IBOutlet for txtBegin is null. 
    [myModel doSomething];
}

您实现的不是 MVC 的预期方式。Apple 提供了为 OSX 开发所需了解的用户界面、框架和编程概念的完整路线图,这将帮助您了解 Apple 希望您如何使用他们的框架。https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/chapters/01_Introduction.html

模型通常对用户界面一无所知它们只是存储数据并在数据更改时进行通信。

  • 您的 Model 类应该为它想要公开的任何数据公开一个属性。
  • 您的模型类不应有任何对 NSTextField 的引用。

所以现在在您的模型中,您可以记录您的属性​​何时更改

-(void)doSomething:(NSString *)value //method name should be setBegin assuming you name your property 'begin'
{
    NSLog(@"I'm in the Model Class"); //logs like a charm!
    begin = 5; //just a test to see if it logs anything (which works)
    NSLog(@"%d",begin);// logs like a charm!
    //->Problem is here <-
    NSLog(@"%@",value); //will log like a charm
}

Views 通常对模型一无所知。它只是以用户可以交互和可能编辑的方式显示数据。

控制器将模型和视图联系在一起。当数据更改并更新视图时,它会从模型接收通知。相反,当编辑数据以更新模型时,它也会收到来自视图的通知。

  • 您的 ViewController 类应该有对 NSTextField 的引用(使用插座)
  • 您的 ViewController 类应该有一个它在内部创建的 Model 实例。

现在您的 logTheVariable 可以实现以将模型和视图绑定在一起:

- (IBAction)logTheVariable:(id)sender 
{
    //Use ViewController's model instance
    Model *myModel = [self myModel];
    NSString * value = [[self txtBegin] stringValue]; 
    [myModel doSomething:value];
}
于 2013-10-24T18:31:53.293 回答
1

简单的解决方案只需在视图控制器中声明文本字段的出口,然后在模型类中修改以下方法并实现它:-

模型.h

 -(void)doSomething: (NSString*)yourstringvalue;

模型.m

 -(void)doSomething: (NSString*)yourstringvalue
 {
    NSLog(@"%@",yourstringvalue);
 }

视频控制器.m

- (IBAction)logTheVariable:(id)sender 
  {
     Model *myModel = [[Model alloc]init];
     NSString * str=self.begintext.stringValue;
    [myModel doSomething:str];
  }
于 2013-10-24T19:15:42.037 回答