0
votes

This is a follow-up on the previous question. Sorry. I could not figure out how to add code or edit something written over 5 minues ago.

A brief summary. I am trying to display a customized/derived TableView over a regular View. I am not using IB, but doing everything from the code. The goal here is to build the application, but also to learn Cocoa/OSX programming. This is my first OSX coding attempt.

NSView atop of which I would like to display my custom TableView is being displayed fine. Please excuse the NSLog garbage. It helps me to learn about the app lifecycle. Header:

#import <Cocoa/Cocoa.h>
#import "MSNavigationTableView.h"

@interface MSNavigationPanelView : NSView

@property (strong, nonatomic) IBOutlet MSNavigationTableView *myNavigationTable;

@end

code:

#import "MSNavigationPanelView.h"

@implementation MSNavigationPanelView

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
        NSLog(@"Initializing Navigation Panel");
    }
    self.myNavigationTable = [[MSNavigationTableView alloc] initWithFrame:self.frame];
    [self.myNavigationTable setDataSource:self.myNavigationTable];
    [self.myNavigationTable setDelegate:self.myNavigationTable];
    [self addSubview:self.myNavigationTable];
    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    // Drawing code here.
    NSLog(@"Drawing navigation view!");
}

@end

Now the NSTableView derived class. Header:

#import <Cocoa/Cocoa.h>

@interface MSNavigationTableView : NSTableView <NSTableViewDataSource>

@end

NSArray *myNavigationArray;

Source:

#import "MSNavigationTableView.h"

@implementation MSNavigationTableView

+ (void)initialize {
    NSLog(@"Called NavigationTableView::initialize!");
    myNavigationArray = [NSArray arrayWithObjects:@"Call History" @"Contacts", @"Messages", @"Voicemail", nil];
}

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    // Drawing code here.
}

- (NSInteger)numberOfRowsInTableView: (NSTableView *) aTableView
{
     return [myNavigationArray count];
}

- (id)tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
{
    NSLog([myNavigationArray objectAtIndex:rowIndex]);
    return [myNavigationArray objectAtIndex:rowIndex];
}

@end

Thank you. I am sure that I am doing something stupid, and/or perhaps not doing something necessary. I have tried to figure this out for a couple of hours. No ideas so far.

2
What is the problem exactly? The table view is not showing? Trying moving the initialization of the table view out of your MSNavigationPanelView's init method and move it into the MSNavigationPanelView's -(void)awakeFromNib methodWill
That did not work. My guess is that I am missing something.Moshe Shmukler
You find your prior question, go down to the space just above your name and below the list of tags (a few inches up from here), and click "edit".Hot Licks

2 Answers

0
votes

You really need to use Interface Builder to make a table. I would never try to programmatically initialized a table... to many things to configure.

NSTableView needs to have NSTableColumns, NSTableColumns need to have NSCell's, etc. etc. NSTableView needs to be embedded in an NSScrollView.

0
votes

I figured out what needs to be done.

First, array initialization has to be moved from +(void)initialize to another method. For me - (id)initWithFrame works fine.

Second, while this was not clear for me, overwriting NSTableViewDataSource is not enough.

One has to create NSTableColumn(s) then add the column(s) to the table using addTableColumn method of NSTableView class. Once that is done, we proceed with setDataSource and so on.