ssloan
ssloan

Reputation: 2286

Initialising an NSTableView

I'm quite new to Cocoa and I am trying to setup a table view backed by an array. I've setup the app delegate as the datasource for the tableview, and implemented NSTableViewDataSource protocol.

When I run the app, I get the following log output:

2012-06-23 18:25:17.312 HelloWorldDesktop[315:903] to do list is nil
2012-06-23 18:25:17.314 HelloWorldDesktop[315:903] Number of rows is 0
2012-06-23 18:25:17.427 HelloWorldDesktop[315:903] App did finish launching

I thought that when I called reloadData on the tableView it would call numberOfRowsInTableView:(NSTableView *)tableView again to refresh the view, but that doesn't seem to be happening. What have I missed?

My .h and .m listings are below.

AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource> 

@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSTableView * toDoListTableView;

@property (assign) NSArray * toDoList;

@end

AppDelegate.m

#import "AppDelegate.h"

@implementation AppDelegate 

@synthesize window = _window;
@synthesize toDoList; 
@synthesize toDoListTableView;

- (void)dealloc
{
    [self.toDoList dealloc];
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLog(@"App did finish launching");
    // Insert code here to initialize your application
  //  toDoList = [[NSMutableArray alloc] init];
    toDoList = [[NSMutableArray alloc] initWithObjects:@"item 1", @"item 2", nil];
    [self.toDoListTableView reloadData];
   // NSLog(@"table view %@", self.toDoListTableView);

}

//check toDoList initialised before we try and return the size
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView {
    NSInteger count = 0;
    if(self.toDoList){
        count = [toDoList count];
    } else{
        NSLog(@"to do list is nil");
    }
    NSLog(@"Number of rows is %ld", count);
    return count;
}

-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSLog(@"in objectValueForTable");
    id returnVal = nil;

    NSString * colId = [tableColumn identifier];

    NSString * item = [self.toDoList objectAtIndex:row];

    if([colId isEqualToString:@"toDoCol"]){
        returnVal = item;
    } 

    return returnVal;

}

@end

Upvotes: 0

Views: 608

Answers (2)

ssloan
ssloan

Reputation: 2286

I fixed it - I'd set the appDelegate as the datasource and the delegate for the tableView but ctrl-dragging from the tableView to the appDelegate, but I hadn't ctrl-dragged the other way to actually link up the outlet I'd declared with the table view. It's working now. Thanks for your help though Jeff.

Upvotes: 0

Jeff Hellman
Jeff Hellman

Reputation: 2117

The first thing that I'd check is that you're NSTableView IBOutlet is still set in applicationDidFinishLaunching.

NSLog(@"self.toDoListTableView: %@", self.toDoListTableView)

You should see output like:

<NSTableView: 0x178941a60>

if the outlet is set properly.

If you see 'nil' rather than an object, double check to ensure that your NSTableView is connected to your outlet in the XIB editing mode of Xcode. Here's a documentation link for assistance connecting outlets.

Upvotes: 1

Related Questions