1

クリック可能なURLタイプのテキスト(このようなURLではありませんが、基本的には、ホバー効果の追跡領域を備えたフチなしのタイトルボタンまたはテキストフィールドセル)の列を作成しようとしていますNSTableView

1.)ユーザーが特定のセルにカーソルを合わせると、そのセルのテキストはテキストの下に下線を引く必要があります(ホバー/追跡可能領域効果)。

2.)ユーザーがテキストをクリックすると、アクションを実行する必要があります。

カスタムテーブルビュー内に追跡領域をサブクラスNSCell化しNSTableViewて追加し、テーブルの個々のセルのマウス位置を追跡して、セルに再描画するタイミングを通知しようとしました。mouseMoved:マウスの位置の現在の行と列を取得できますが、カスタムテーブルビューのメソッドで正しいセルを取得できないようです

-(void)mouseMoved:(NSEvent *)theEvent {
  [super mouseMoved:theEvent];
  NSPoint p = [self convertPoint:[theEvent locationInWindow] fromView:nil];
  long column = [self columnAtPoint:p];
  long row = [self rowAtPoint:p];
  id cell = [[self.tableColumns objectAtIndex:column] dataCellForRow:row];
}

列のセルを取得しますが、その特定の行の適切なセルを取得しません。おそらく私はそのdataCellForRow:機能を完全に理解していませんNSTableColumnか?

セルの追跡領域を完全に追加することはできませんが、代わりに、マウスクリックのヒットテストを作成し、ヒットテストが成功したら(つまり、マウスがすでに下がっている)追跡を開始してから、、、およびを使用する必要がstartTracking:ありcontinueTracking:ますstopTracking:。マウスの位置を取得します。mouseDown:ただし、アクションの前にホバー効果があるという考え方です。

また、私のアプリは10.6と互換性がなければならないため、ビューベースのテーブルビュー(これは信じられないほどです)を使用することはできません。

4

1 に答える 1

5

セルを取得する方法の何が問題になっているのかわかりませんが、必要なことを実行するために実際に取得する必要はありません。これを行う方法をテストしました。これには、マウス移動メソッドで追跡を行うためのテーブルビューサブクラスを作成する必要がありました。そのサブクラスのコードは次のとおりです。

-(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」を持つ)をクリックした場合のアクションを実装します。

于 2012-08-11T06:36:02.063 に答える