2013-10-24 45 views
0

主要思路:基本MVC:設置變量的NSTextField輸入不同類別

型號:從textfield值設置爲我可以調用/日誌的變量。

查看:只是一個NSTextField迷上了Model類。

控制器:NSButton迷上了ViewController

正如您會注意到的那樣,它記錄了NSLog的基本字符串,也是預定義的begin值。但當我要求的txtBegin價值它返回NULL

我知道TextFieldButton掛鉤在連接檢查。

截圖:

enter image description here

Downloadable project:

ViewController.h

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

@end 

ViewController.m

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

Model.h

#import <Foundation/Foundation.h> 

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

//methods 
-(void)doSomething; 

@end 

Model.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 
+0

沒有工作,我還是謝謝你! –

回答

1

簡單的解決方案只需要聲明文本框的出口在您的視圖控制器,然後修改下面的方法在你的模型類,並實現它: -

Model.h

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

Model.m

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

Viecontroller.m

- (IBAction)logTheVariable:(id)sender 
    { 
    Model *myModel = [[Model alloc]init]; 
    NSString * str=self.begintext.stringValue; 
    [myModel doSomething:str]; 
    } 
1

logTheVariable:使用Model類實例被記錄爲空值,因爲它是一個新的實例您在ViewController的操作中創建的,而不是Model interface構建器知道的實例。

- (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

模型一般不知道關於用戶界面的任何東西。它們只是存儲數據並在數據發生變化時進行通信。

  • 您的模型類應該公開一個屬性以顯示任何想要公開的數據。
  • 您的模型類不應該有任何對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 
} 

次數一般不知道什麼模型日誌。它只是以用戶可以與之交互和可能編輯的方式顯示數據。

控制器將模型和視圖連接在一起。它在數據更改並更新視圖時從模型接收通知。相反,當數據被編輯以更新模型時,它也接收來自視圖的通知。

  • 你的ViewController類應該具有到的NSTextField的引用(使用的出口)
  • 你的ViewController類應該有模型的一個實例,它在內部創建。

現在你logTheVariable可以實現扳平Model和View在一起:

- (IBAction)logTheVariable:(id)sender 
{ 
    //Use ViewController's model instance 
    Model *myModel = [self myModel]; 
    NSString * value = [[self txtBegin] stringValue]; 
    [myModel doSomething:value]; 
} 
+0

所以如果我理解正確的話;我的ViewController應該有一個nstextfield的@property。該模型不允許有一個。但是,如何將NSTextField值發送到模型,以便它可以使用它的值並將其返回給視圖? (例如,將該值設置爲標籤)謝謝您的迴應! –

+0

經編輯可向您顯示特定的代碼。 –