2

我正在努力学习 Objective-C/Coaoa,但我似乎有点坚持让 NSTableView 对象为我工作。我已按照所有指示进行操作,但由于某种原因,我仍然收到此错误:

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

这是我的消息来源,告诉我你在这里看到了什么,我要撕掉我的脸。

机器人管理器.h

@interface RobotManager : NSObject {
 // 接口变量
 IBOutlet NSWindow *MainWindow;
 IBOutlet NSTableView *RobotTable;
 NSMutableArray *RobotList;
}

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

机器人管理器.m

#import "RobotManager.h"

@实现机器人管理器

-(无效)awakeFromNib {
 // 生成一些虚拟 val
 [RobotList addObject:@"Hello"];
 [RobotList addObject:@"World"];
 [RobotTable setDataSource:self]; // 这是我收到协议警告的地方
 [RobotTable 重载数据];
}

-(int) numberOfRowsInTableView: (NSTableView *) tableView {
 返回[机器人列表计数];
}

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

@结尾

如果这有什么不同,我正在运行 OS X 10.6.1。提前致谢。

4

2 回答 2

8

一方面,数据源方法现在处理的是NSIntegers,而不是ints。

更相关的是,如果您的部署目标是 Mac OS X 10.6 或更高版本,那么您需要NSTableViewDataSource 的类的@interface. (此协议和许多其他协议是 10.6 中的新协议;以前,它们是非正式协议。)

于 2009-09-12T23:45:55.127 回答
6

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

@interface RobotManager : NSObject <NSTableViewDataSource> {

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

编辑:

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

除非有awakeFromNib来自某个调用者的显式调用,RobotList否则不会初始化,所以不要在该方法中填充,而是在第一次实例化RobotList时尝试填充它。RobotManager

于 2009-09-12T23:48:49.570 回答