gpt4 book ai didi

objective-c - NSTableView 中具有悬停效果的可点击文本

转载 作者:行者123 更新时间:2023-12-03 16:52:39 25 4
gpt4 key购买 nike

我正在尝试在 中创建一列可点击的 URL 类型文本(不是像 this 这样的 URL,但本质上是一个无边框的标题按钮或文本字段单元格,带有用于悬停效果的跟踪区域) NSTableView

1.) 当用户将鼠标悬停在特定单元格上时,该单元格中的文本应在文本下方绘制下划线(悬停/可跟踪区域效果)。

2.) 当用户单击文本时,它应该执行一个操作。

我对 NSCellNSTableView 进行了子类化,并在自定义表格 View 中添加了一个跟踪区域,以尝试跟踪表格中各个单元格的鼠标位置,以通知单元格何时重绘自身。我可以获取鼠标位置的当前行和列,但似乎无法在自定义表格 View 的 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];
}

它获取列的单元格,但没有获取该特定行的正确单元格。也许我没有完全理解 NSTableColumndataCellForRow: 函数?

我知道您无法完全为单元格添加跟踪区域,但您必须为鼠标单击创建 HitTest ,然后在 HitTest 成功后开始跟踪(意味着鼠标已经按下),然后使用 startTracking:continueTracking:stopTracking: 来获取鼠标的位置。但其想法是,它在任何 mouseDown: 操作之前具有悬停效果。

此外,我不能只使用基于 View 的表格 View (这将是令人难以置信的),因为我的应用程序必须兼容 10.6。

最佳答案

我不确定你获取细胞的方法有什么问题,但你实际上并不需要让它来做你想做的事。我测试了一种方法来做到这一点,需要创建一个 TableView 子类来在鼠标移动方法中进行跟踪。这是该子类的代码:

-(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];
}

我将数组和表委托(delegate)以及数据源代码放在应用程序委托(delegate)中(可能不是最好的位置,但可以用于测试)。

- (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]);
}

如果您单击第一列中的单元格(在 IB 中设置了标识符“Link”),我将使用委托(delegate)方法 tableViewSelectionDidChange: 来实现操作。

关于objective-c - NSTableView 中具有悬停效果的可点击文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11911246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com