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