views:

136

answers:

1

I have only just started with XCode (v3.2.2) and Interface Builder and have run into a problem.

Here is what I have done:

I have made a class to be the datasource of a NSTableView:

@interface TimeObjectsDS : NSControl {
  IBOutlet NSTableView * idTableView;
  NSMutableArray * timeObjects;
}
@property (assign) NSMutableArray * timeObjects;
@property (assign) NSTableView * idTableView;

- (id) init;
- (void) dealloc;

- (void) addTimeObject: (TimeObj *)timeObject;    

// NSTableViewDataSource Protocol functions
- (int)numberOfRowsInTableView:(NSTableView *)tableView;
- (id)tableView:(NSTableView *)tableView 
            objectValueForTableColumn:(NSTableColumn *)tableColumn row:
            (int)row;


@implementation TimeObjectsDS

@synthesize timeObjects;
@synthesize idTableView;

-(id) init {        
    if (self = [super init]) {
        self.timeObjects = [[NSMutableArray alloc] init];

        TimeObj *timeObject = [[TimeObj alloc] init];
        [timeObject setProjectId:11];
        [timeObject setDescription:@"Heja"];
        [timeObject setRegDate:@"20100331"];
        [timeObject setTimeSum:20.0];

        [timeObjects addObject:timeObject];     

        [timeObject release];

        [idTableView reloadData];        
    }

    return self;
}

- (void) dealloc {
    [idTableView release];
    [timeObjects release];
    [super dealloc];        
}
// Functions
- (void) addTimeObject: (TimeObj *)timeObject {
    [self.timeObjects addObject:timeObject];

    [idTableView reloadData];       
}   

// NSTableViewDataSource Protocol functions
- (int) numberOfRowsInTableView:(NSTableView *)tableView {

    return [self.timeObjects count];
}

- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row {

    return [[timeObjects objectAtIndex:row] description];
}
@end

I have then bound my NSTableView in the View to this datasource like so:

alt text

I have also bound the View NSTableView to the Controller idTableView variable in Interface Builder seen above

In the init function I add a element to the mutable array. This is displayed correctly in the NSTableView when I run the application. However when I add another element to the array (of same type as in init) and try to call [idTableView reloadData] on the View nothing happens. In fact the Controller idTableView is null. When printing the variable with NSLog(@"idTableView: %@", idTableView) I get "idTableView: (null)"

Im runing out of ideas how to fix this. Any ideas to what I could do to fix the binding?

+1  A: 

If your tableview outlet in your controller is null, then you haven't connected it in Interface Builder. Your screenshot above shows a connection to TimeObjectsDS, but that doesn't mean a lot - is that the instance that you are calling reloadData from? It is possible that you have more than one instance of this class, for example.

That's just one possibility. Without more code, it's not feasible to list many more.

Incidentally, in MVC it's considered a bad thing to connect a model object directly to a view. You may just be using the terminology incorrectly.

Paul Lynch
Many thanks for your time. I have added the implementation code and corrected the terminology. I only have one instance of TimeObjectDS and I call reloadData from within it.
Niklas Ottosson
Where are you calling your method from? (it's not a function). If it is called before awakeFromNib, then the tableView will still be nil.It is more normal to create object properties as retain, not assign, but your code isn't wrong as such. You are also inconsistent in your use of self. to refer to properties, but again, the code isn't wrong, and a lot of people do the same.
Paul Lynch
Again many thanks for your time. I did call the method before awakeFromNib.
Niklas Ottosson