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,如果这有任何区别的话.提前致谢.
首先,数据源方法现在处理的是NSInteger
s,而不是int
s.
更贴切,如果您的部署目标是否为Mac OS X 10.6或更高版本,那么你需要声明你的数据源的类为符合的NSTableViewDataSource
正式协议在你的类的@interface
.(该协议和许多其他协议在10.6中是新的;之前,它们是非正式协议.)
尝试将声明更改@interface
为以下内容:
@interface RobotManager : NSObject <NSTableViewDataSource> {
Run Code Online (Sandbox Code Playgroud)
这将告诉编译器RobotManager
该类遵循NSTableViewDataSource
协议.
编辑:
另外,可能在调用RobotList
两种方法之前没有初始化NSTableViewDataSource
.换句话说,awakeFromNib
没有被召唤.
除非有awakeFromNib
来自某个调用者的显式调用,否则RobotList
将不会初始化,因此RobotList
在RobotManager
首次实例化时尝试填充该方法而不是填充该方法.
归档时间: |
|
查看次数: |
2068 次 |
最近记录: |