NSTableView未显示

时间:2014-09-18 13:02:37

标签: objective-c macos cocoa nstableview

这是对上一个问题的跟进。 抱歉。我无法弄清楚如何添加代码或编辑超过5分钟前​​编写的内容。

简要总结。我试图在常规视图上显示自定义/派生的TableView。我不是在使用IB,而是从代码中做所有事情。这里的目标是构建应用程序,同时也学习Cocoa / OSX编程。这是我的第一次OSX编码尝试。

NSView atop我想显示我的自定义TableView正在显示正常。请原谅NSLog垃圾。它帮助我了解应用程序生命周期。 部首:

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

@interface MSNavigationPanelView : NSView

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

@end

代码:

#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

现在是NSTableView派生类。 部首:

#import <Cocoa/Cocoa.h>

@interface MSNavigationTableView : NSTableView <NSTableViewDataSource>

@end

NSArray *myNavigationArray;

来源:

#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

谢谢。我确信我做的事情很愚蠢,而且/或者可能没有做必要的事情。我试图解决这个问题几个小时。到目前为止没有任何想法。

2 个答案:

答案 0 :(得分:0)

您确实需要使用Interface Builder来制作表格。 我永远不会尝试以编程方式初始化一个表......要配置很多东西。

NSTableView需要有NSTableColumns,NSTableColumns需要有NSCell等等。 NSTableView需要嵌入NSScrollView。

答案 1 :(得分:0)

我想出了需要做些什么。

首先,必须将数组初始化从+(void)初始化移动到另一个方法。对我来说 - (id)initWithFrame工作正常。

其次,虽然我不清楚,但覆盖NSTableViewDataSource是不够的。

必须创建NSTableColumn,然后使用NSTableView类的addTableColumn方法将列添加到表中。完成后,我们继续使用setDataSource,依此类推。