tags:

views:

37

answers:

1

I'm building a document based Mac application. I have two classes myDocument and Person. The difficulty I'm having is when I push the button to add a new Person in the table view and display it it doesn't show in the table view. I've placed log statements inside the delegate methods. Since my log statements are not being displayed in the console I know they are not being called. Here are the implementations of the delegate methods

    - (int)numberOfRowsInTableView:(NSTableView *)aTableView
    {
        return [employees count];
    }

    - (id)tableView:(NSTableView *)aTableView
    objectValueForTableColumn:(NSTableColumn *)aTableColumn
                row:(int)rowIndex
    {
        // What is the identifier for the column?
        NSString *identifier = [aTableColumn identifier];
        NSLog(@"the identifier's name is : %s",identifier);
        // What person?
        Person *person = [employees objectAtIndex:rowIndex];

        // What is the value of the attribute named identifier?
        return [person valueForKey:identifier];
    }

    - (void)tableView:(NSTableView *)aTableView
       setObjectValue:(id)anObject
       forTableColumn:(NSTableColumn *)aTableColumn
                  row:(int)rowIndex
    {
        NSString *identifier = [aTableColumn identifier];
        Person *person = [employees objectAtIndex:rowIndex];
        NSLog(@"inside the setObjectMethod: %@",person);

        // Set the value for the attribute named identifier
        [person setValue:anObject forKey:identifier];

    [tableView reloadData];
}

Here is a pic of my .xibalt text

Here are my actions methods

#pragma mark Action Methods
-(IBAction)createEmployee:(id)sender
{
    Person *newEmployee = [[Person alloc] init];
    [employees addObject:newEmployee];
    [newEmployee release];
    [tableView reloadData];
    NSLog(@"the new employees name is : %@",[newEmployee personName]);
}
-(IBAction)deleteSelectedEmployees:(id)sender
{
    NSIndexSet *rows = [tableView selectedRowIndexes];

    if([rows count] == 0){
        NSBeep();
        return;
    }
    [employees removeObjectAtIndexs:rows];
    [tableView reloadData];

}

+3  A: 

You forgot to bind the document's tableView outlet to the actual table view. Thus your reloadData messages are sent to nil.

Pierre Bernard
Whenever I add new action/outlet code, I put NSAssert(outlet!=nil); somewhere in the path. Because more often than not I forget to hook up all the connections in ib.
Graham Lee