NSTableView麻烦

Ste*_*uso 2 macos cocoa objective-c nstableview

我正在学习Objective-C/Coaoa,但我似乎已经让NSTableView对象适合我了.我遵循了所有指示,但由于某种原因,我仍然得到这个错误:

Class 'RobotManager' does not implement the 'NSTableViewDataSource' protocol
Run Code Online (Sandbox Code Playgroud)

这是我的来源,告诉我你在这里看到的是错的,我即将撕掉我的脸.

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,如果这有任何区别的话.提前致谢.

Pet*_*sey 8

首先,数据源方法现在处理的是NSIntegers,而不是ints.

更贴切,如果您的部署目标是否为Mac OS X 10.6或更高版本,那么你需要声明你的数据源的类为符合NSTableViewDataSource 正式协议在你的类的@interface.(该协议和许多其他协议在10.6中是新的;之前,它们是非正式协议.)


coo*_*ird 6

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

@interface RobotManager : NSObject <NSTableViewDataSource> {
Run Code Online (Sandbox Code Playgroud)

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

编辑:

另外,可能在调用RobotList两种方法之前没有初始化NSTableViewDataSource.换句话说,awakeFromNib没有被召唤.

除非有awakeFromNib来自某个调用者的显式调用,否则RobotList将不会初始化,因此RobotListRobotManager首次实例化时尝试填充该方法而不是填充该方法.