On Feb 12, 2010, at 1:31 PM, Donald Klett wrote:

> Once again, I am not understanding some aspect of Objective C and/or Cocoa.
> 
> I created a simple class that contains two NSTextField objects.  I used IB to 
> connect the Controller object with the two text fields.  The code follows.  
> This example runs correctly and does copy the value from one text field to 
> the other.
> 
> #import <Cocoa/Cocoa.h>
> 
> @interface Controller : NSObject {
>       IBOutlet NSTextField*   textField;
>       IBOutlet NSTextField*   copyField;
> }
> 
> - (IBAction) buttonTarget: (id) sender;
> 
> @end
> 
> #import "Controller.h"
> 
> @implementation Controller
> 
> - (IBAction) buttonTarget: (id) sender {
>       int     textValue;
>       
>       textValue = [textField intValue];
>       [copyField setIntegerValue:textValue];
> }
> 
> @end

Okay, all is groovy so far.    What you've left unstated in the explanation 
above is that the
two text fields must have been allocated *somewhere*.    I can make a SWAG that 
you
dragged a couple of text fields from IB's palette onto the (content view) of 
the main window
that shows up when you open MainMenu.xib, yes ?

If that is the case, you have two (instantiated and correctly * initialised by 
IB) text fields that
you can connect to from your (presumably also instantiated and initialised by 
IB) Controller
object.


> Now if I extend this to two objects (Controller and View), the resulting code 
> does not execute correctly.  Again, I used IB to connect the View object to 
> the two text fields.  Using the debugger I find that the two NSTextField 
> objects have not been allocated (both have nil values).  The code follows:

> 
> #import <Cocoa/Cocoa.h>
> #import "View.h"
> 

Minor detail here.    Use @class forward references in .h files instead
of importing the class's .h file in your Controller's .h file.    In other 
words,
delete the    #import "View.h   line and add a   @class  View;    line . . .

This tells the compiler you'll be referencing the View class in your .h file
with an unspoken promise you will include the  View.h  file in your 
Controller's  .m
file . . .

> @interface Controller : NSObject {
> 
>       View*   view;
> }
> 
> - (IBAction) buttonTarget: (id) sender;
> 
> @end

> 
> #import "Controller.h"
> #import "View.h"
> 
> @implementation Controller
> 
> - (id) init {
>       if (self = [super init]) {
>               view = [[View alloc] init];
>       }
>       return self;
> }

Below, you have  View  as a sub-class of NSObject.    Why?
If View is supposed to be a sub-class of NSView, your [[View alloc] init]
above needs to be [[View alloc] initWithFrame: . . .]
> 
> - (IBAction) buttonTarget: (id) sender {
>       [view copyFieldValue];
> }
> 
> @end
> 
> #import <Cocoa/Cocoa.h>
> 
> @interface View : NSObject {
> 
>       IBOutlet NSTextField*   textField;
>       IBOutlet NSTextField*   copyField;
>       
> }
> 
> - (void) copyFieldValue;
> 
> @end

Based on this declaration, do you have a View object instantiated in your 
MainMenu.xib,
and did you then connect the two outlets to the two text fields from that 
already instantiated object?
If so, after then instantiating a View object in your Controller, your 
Controller is now talking to
the wrong View object and the one from the xib is being ignored . . .

> 
> #import "View.h"
> 
> 
> @implementation View
> 
> - (void) copyFieldValue {
>       [copyField setIntegerValue:[textField intValue]];
> }
> 
> @end
> 
> I have no idea what I am doing wrong.  Any help would be most appreciated.  
> Thanks in advance.

I hope this helps a little.     One of the more common beginner mistakes
is to instantiate an object in the xib, and then instantiate a completely
new version in code . . .

And as (I think) someone already pointed out, if you have a class whose
name is View, anybody reading your code superficially would expect it to
*be* something that relates to existing NSView or UIView classes and have 
View-like behaviour . . .

A useful exercise to do is to look at your xib objects and draw a picture of
the objects and their connections --- that essentially defines your 'Application
Architecture', and a picture can quickly show up anomalies in the object
graph --- either orphan objects as I suspect in the case, or objects that aren't
really doing anything useful . . .

    Cheers,
         . . . . . . . .    Henry



=================================================
iPhone App Development and Developer Education . . .
        Visit  www.nonatomic-retain.com

Mac OSX Application Development, Plus a Great Deal More . . .
        Visit  www.trilithon.com

_______________________________________________

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