セルを取得する方法の何が問題になっているのかわかりませんが、必要なことを実行するために実際に取得する必要はありません。これを行う方法をテストしました。これには、マウス移動メソッドで追跡を行うためのテーブルビューサブクラスを作成する必要がありました。そのサブクラスのコードは次のとおりです。
-(void)awakeFromNib {
NSTrackingArea *tracker = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited|NSTrackingMouseMoved|NSTrackingActiveInActiveApp owner:self userInfo:nil];
[self addTrackingArea:tracker];
self.rowNum = -1;
}
-(void)mouseMoved:(NSEvent *)theEvent {
NSPoint p = theEvent.locationInWindow;
NSPoint tablePoint = [self convertPoint:p fromView:nil];
NSInteger newRowNum = [self rowAtPoint:tablePoint];
NSInteger newColNum = [self columnAtPoint:tablePoint];
if (newColNum != self.colNum || newRowNum != self.rowNum) {
self.rowNum = newRowNum;
self.colNum = newColNum;
[self reloadData];
}
}
-(void)mouseEntered:(NSEvent *)theEvent {
[self reloadData];
}
-(void)mouseExited:(NSEvent *)theEvent {
self.rowNum = -1;
[self reloadData];
}
配列とテーブルのデリゲートとデータソースコードをアプリデリゲートに配置しました(おそらく最適な場所ではありませんが、テストには問題ありません)。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
self.theData = @[@{@"name":@"Tom",@"age":@"47"},@{@"name":@"Dick",@"age":@"21"},@{@"name":@"Harry",@"age":@"27"}];
[self.table reloadData];
self.dict = [NSDictionary dictionaryWithObjectsAndKeys:@2,NSUnderlineStyleAttributeName,[NSColor redColor],NSForegroundColorAttributeName,nil];
}
- (NSInteger)numberOfRowsInTableView:(RDTableView *)aTableView {
return self.theData.count;
}
- (id)tableView:(RDTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
if (self.table.colNum == 0 && rowIndex == self.table.rowNum && [aTableColumn.identifier isEqualToString:@"Link"]) {
NSString *theName = [[self.theData objectAtIndex:rowIndex] valueForKey:@"name"];
return [[NSAttributedString alloc] initWithString:theName attributes:self.dict];
}else if ([aTableColumn.identifier isEqualToString:@"Link"]){
return [[self.theData objectAtIndex:rowIndex] valueForKey:@"name"];
}else{
return [[self.theData objectAtIndex:rowIndex] valueForKey:@"age"];
}
}
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification {
if (self.table.colNum == 0)
NSLog(@"%ld",[aNotification.object selectedRow]);
}
デリゲートメソッドtableViewSelectionDidChange:を使用して、最初の列のセル(IBで設定された識別子「Link」を持つ)をクリックした場合のアクションを実装します。