On Feb 9, 2010, at 9:21 AM, Donald Klett wrote:

> I am trying to learn Cocoa and wrote a simple app using the MVC pattern.  The 
> view controls two text fields, the controller receives events from a single 
> button, and the model receives the value entered into the first text field, 
> and then requests the view to display that value in the second text field.

You're actually breaking the MVC pattern here. The model should not have a 
reference to the View - that's the controller's business. The model should be 
completely agnostic of how it's displayed.

>  I used IB to construct the UI and connect the view object with the text 
> fields, and made the controller the target for the button.  The build is 
> successful, but the value from the first text field is not copied into the 
> second.  A printf shows the integer value from the first text field is zero.  
> Here are the short files.  Thanks in advance.

At which point in your code did you print the value? What was in the text field 
when you saw zero being printed? Set a breakpoint in your viewAction and print 
the value of the text field. What does that tell you?

[snip]

> - (void) showValue;

That's the method that should be in the controller, not in the model. Also, the 
View instance variable should be in the controller.

> @implementation Model
> 
> - (id) init {
>       self = [super init];
>       view = [[View alloc] init];
>       return self;
> }
> 
> @synthesize value;
> 
> - (void) showValue {
>       self.value = [view getFieldValue];
>       [view setResult:self.value];
> }
> 
> @end

You're missing a dealloc method - you'll leak view. Also, your init method 
isn't according to the standard. You should always check if [super init] 
returns nil. Check the Cocoa Fundamentals Guide. Same for your other classes.

> ------
> 
> #import <Cocoa/Cocoa.h>
> 
> 
> @interface View : NSObject {
> 
>       IBOutlet NSTextField*   number;
>       IBOutlet NSTextField*   result;
>       
> }

Pet peeve: don't name text fields with names that suggest they're model 
objects. Something like numberField would be less confusing to others.

> - (int) getFieldValue;
> 
> - (void) setResult: (int) value;
> 
> @end
> 
> ------
> 
> #import "View.h"
> 
> 
> @implementation View
> 
> - (int) getFieldValue {
>       return [number intValue];
> }
> 
> - (void) setResult: (int) value {
>       [result setIntValue:value];
> }
> 
> @end
> 
> ------
> 
> #import <Cocoa/Cocoa.h>
> #import "Model.h"
> 
> 
> @interface Controller : NSObject {
> 
>       Model*  model;
>       
> }

This is where your View instance variable goes.

> - (IBAction) viewAction: (id) sender;
> 
> @end
> 
> ------
> 
> #import "Controller.h"
> 
> 
> @implementation Controller
> 
> - (id) init {
>       self = [super init];
>       model = [[Model alloc] init];
>       return self;
> }
> 
> - (IBAction) viewAction: (id) sender {
>       [model showValue];
> }

And in this method, you ask the model for its value and you have the view 
display it.

Welcome to Cocoa, and good luck!
Hank

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to