NSTableView Troubles
-
06-07-2019 - |
Frage
Ich arbeite Objective-C / Coaoa auf das Lernen, aber ich habe scheinen ein wenig zu haben, mit dem Erhalten der NSTableView Objekt stecken geblieben für mich zu arbeiten. Ich habe alle Richtungen gefolgt, aber aus irgendeinem Grund, den ich immer noch diesen Fehler:
Class 'RobotManager' does not implement the 'NSTableViewDataSource' protocol
Hier ist meine Quelle, sagen Sie mir, was Sie hier sehen, ist falsch, ich bin über mein Gesicht abreißen.
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
Ich bin mit OS X 10.6.1, ob das einen Unterschied macht. Vielen Dank im Voraus.
Lösung
Versuchen Sie, die Erklärung des @interface
auf die folgende Veränderung:
@interface RobotManager : NSObject <NSTableViewDataSource> {
Damit wird den Compiler sagen, dass die RobotManager
Klasse des NSTableViewDataSource
Protokoll folgt.
Edit:
Darüber hinaus ist es wahrscheinlich wahrscheinlich, dass der RobotList
nicht initialisiert wird, bevor die beiden Methoden des NSTableViewDataSource
genannt werden. In anderen Worten, wird awakeFromNib
nicht genannt zu werden.
Es sei denn, es einen expliziten Aufruf der awakeFromNib
von einem Anrufer, wird der RobotList
nicht initialisiert werden, so anstatt die RobotList
in diesem Verfahren bevölkern, versuchen Sie es bevölkern, wenn die RobotManager
zuerst instanziiert.
Andere Tipps
Zum einen beschäftigen sich die Datenquelle Methoden jetzt mit NSInteger
s, nicht int
s.
Weitere einschlägig, wenn Ihre Bereitstellung Ziel Mac OS X 10.6 oder höher ist, dann müssen Sie Ihre Datenquelle Klasse als konform die NSTableViewDataSource
formal Protokoll in @interface
Ihre Klasse. (Dieses Protokoll und viele andere sind neu in 10.6; vorher waren sie informelle Protokolle.)