NSTableViewのトラブル
-
06-07-2019 - |
質問
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 内の
コード>。 (このプロトコルと他の多くのプロトコルは10.6で新しく追加されました。以前は非公式のプロトコルでした。) NSTableViewDataSource
フォーマルプロトコル