views:

131

answers:

1

Hi,

I'm teaching myself cocoa and enjoying the experience most of the time. I have been struggling all day with a simple problem that google has let me down on. I have read the Cocoa Bindings Program Topics and think I grok it but still can't solve my issue.

I have a very simple class called MTSong that has various properties. I have used @synthesize to create getter/setters and can use KVC to change properties. i.e in my app controller the following works:

mySong = [[MTSong alloc]init];
[mySong setValue:@"2" forKey:@"version"];

In case I am doing something noddy in my class code MTSong.h is:

#import <Foundation/Foundation.h>

@interface MTSong : NSObject {
    NSNumber    *version;
    NSString    *name;
}
@property(readwrite, assign) NSNumber *version;
@property(readwrite, assign) NSString *name;
@end

and MTSong.m is:

#import "MTSong.h"

@implementation MTSong

- (id)init
{
    [super init];
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

@synthesize version;
@synthesize name;
@end

In Interface Builder I have a label (NSTextField) that I want to update whenever I use KVC to change the version of the song. I do the following:

  1. Drag NSObjectController object into the doc window and in the Inspector->Attributes I set:

    • Mode: Class
    • Class Name: MTSong
    • Add a key called version and another called name
  2. Go to Inspector->Bindings->Controller Content

    • Bind To: File's Owner (Not sure this is right...)
    • Model Key Path: version
  3. Select the cell of the label and go to Inspector

    • Bind to: Object Controller
    • Controller Key: mySong
    • Model Key Path: version

I have attempted changing the Model Key Path in step 2 to "mySong" which makes more sense but the compiler complains. Any suggestions would be greatly appreciated.

Scott


Update Post Comments

I wasn't exposing mySong property so have changed my AppController.h to be:

#import <Cocoa/Cocoa.h>
@class MTSong;

@interface AppController : NSObject {
    IBOutlet NSButton *start;
    IBOutlet NSTextField *tf;
    MTSong *mySong;
}
-(IBAction)convertFile:(id)sender;
@end

I suspect File's owner was wrong as I am not using a document based application and I need to bind to the AppController, so step 2 is now:

  1. Go to Inspector->Bindings->Controller Content
    • Bind To: App Controller
    • Model Key Path: mySong

I needed to change 3. to

  1. Select the cell of the label and go to Inspector
    • Bind to: Object Controller
    • Controller Key: selection
    • Model Key Path: version

All compiles and is playing nice!

+1  A: 

You want to bind the controller's content to the mySong key path as you suggested. What you are perhaps not doing is exposing mySong as a property or instance method in the File's Owner (typically your application delegate).

Martin Gordon
Thanks for your response Martin. See the edited post above for my corrections to solve the problem post your input.
scottw