質問

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を実行しているのは、それが違いを生む場合です。事前に感謝します。

役に立ちましたか?

解決

@interface の宣言を次のように変更してみてください:

@interface RobotManager : NSObject <NSTableViewDataSource> {

これは、 RobotManager クラスが NSTableViewDataSource プロトコルに従うことをコンパイラーに通知します。

編集:

さらに、 NSTableViewDataSource の2つのメソッドが呼び出される前に、 RobotList が初期化されていない可能性があります。つまり、 awakeFromNib は呼び出されていません。

一部の呼び出し元から awakeFromNib への明示的な呼び出しがない限り、 RobotList を設定するのではなく、 RobotList は初期化されません>そのメソッドで、 RobotManager が最初にインスタンス化されたときにデータを入力してみます。

他のヒント

1つには、データソースメソッドが int ではなく NSInteger を処理するようになりました。

さらに関連して、展開ターゲットがMac OS X 10.6以降の場合、データソースのクラスがクラスの @interface NSTableViewDataSource フォーマルプロトコルコード>。 (このプロトコルと他の多くのプロトコルは10.6で新しく追加されました。以前は非公式のプロトコルでした。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top