NSObjectController confusion binding to a class property. Help!

Posted by scottw on Stack Overflow See other posts from Stack Overflow or by scottw
Published on 2010-02-09T22:04:25Z Indexed on 2010/03/30 3:13 UTC
Read the original article Hit count: 579

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!

© Stack Overflow or respective owner

Related posts about objective-c

Related posts about cocoa-bindings