NSTableView麻烦

时间:2009-09-12 23:26:19

标签: objective-c cocoa macos nstableview

我正在学习Objective-C / Coaoa,但我似乎已经因为让NSTableView对象适合我而陷入困境。我遵循了所有指示,但由于某种原因,我仍然会收到此错误:

Class 'RobotManager' does not implement the 'NSTableViewDataSource' protocol

这是我的来源,告诉我你看到的是错的,我要把脸撕下来。

RobotManager.h

@interface RobotManager : NSObject {
 // Interface vars
 IBOutlet NSWindow *MainWindow;
 IBOutlet NSTableView *RobotTable;
 NSMutableArray *RobotList;
}

- (int) numberOfRowsInTableView: (NSTableView*) tableView;
- (id) tableView:(NSTableView *) tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex;
@end

RobotManager.m

#import "RobotManager.h"

@implementation RobotManager

-(void) awakeFromNib {
 // Generate some dummy vals
 [RobotList addObject:@"Hello"];
 [RobotList addObject:@"World"];
 [RobotTable setDataSource:self]; // This is where I'm getting the protocol warning
 [RobotTable reloadData];
}

-(int) numberOfRowsInTableView: (NSTableView *) tableView {
 return [RobotList count];
}

-(id) tableView:(NSTableView *) tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex {
 return [RobotList objectAtIndex:rowIndex];
}

@end

我正在运行OS X 10.6.1,如果这有任何区别的话。提前谢谢。

2 个答案:

答案 0 :(得分:8)

首先,数据源方法现在处理NSInteger s,而不是int s。

更相关的是,如果您的部署目标是Mac OS X 10.6或更高版本,那么您需要将您的数据源类声明为符合班级@interface中的the NSTableViewDataSource formal protocol。 (该协议和许多其他协议在10.6中是新的;以前,它们是非正式协议。)

答案 1 :(得分:6)

尝试将@interface的声明更改为以下内容:

@interface RobotManager : NSObject <NSTableViewDataSource> {

这将告诉编译器RobotManager类遵循NSTableViewDataSource协议。

修改

此外,在RobotList的两个方法被调用之前,NSTableViewDataSource可能未被初始化。换句话说,awakeFromNib未被调用。

除非某个调用者明确调用awakeFromNib,否则RobotList将不会被初始化,因此不要在该方法中填充RobotList,请尝试填充它时RobotManager首先被实例化。