Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSTableView中具有悬停效果的可单击文本_Objective C_Cocoa_Hover_Nstableview_Textfield - Fatal编程技术网

Objective c NSTableView中具有悬停效果的可单击文本

Objective c NSTableView中具有悬停效果的可单击文本,objective-c,cocoa,hover,nstableview,textfield,Objective C,Cocoa,Hover,Nstableview,Textfield,我试图创建一列可单击的URL类型文本,不像URL那样,而是本质上是一个无边框、标题按钮或文本字段单元格,在NSTableView中有一个用于悬停效果的跟踪区域 一,。当用户将鼠标悬停在特定单元格上时,该单元格中的文本应在文本悬停/可跟踪区域效果下方画一条下划线 二,。当用户单击文本时,它应该执行一个操作 我已经对NSCell和NSTableView进行了子类化,并在自定义tableview中添加了一个跟踪区域,以尝试跟踪表中单个单元格的鼠标位置,从而通知单元格何时重新绘制自身。我可以获取鼠标位置

我试图创建一列可单击的URL类型文本,不像URL那样,而是本质上是一个无边框、标题按钮或文本字段单元格,在NSTableView中有一个用于悬停效果的跟踪区域

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

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

我已经对NSCell和NSTableView进行了子类化,并在自定义tableview中添加了一个跟踪区域,以尝试跟踪表中单个单元格的鼠标位置,从而通知单元格何时重新绘制自身。我可以获取鼠标位置的当前行和列,但似乎无法在自定义tableview的mouseMoved:方法中获取正确的单元格

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

我知道你不能为单元格添加一个跟踪区域,但是你必须为鼠标点击创建点击测试,然后在点击测试成功后开始跟踪,这意味着鼠标已经放下,然后使用startTracking:、ContinuetTracking:、stopTracking:,来获取鼠标的位置。不过,这个想法是,它在任何mouseDown:action之前都有一个悬停效果


此外,我不能只使用基于视图的tableview,这将是难以置信的,因为我的应用程序必须与10.6兼容。

我不确定你获取单元格的方法有什么问题,但你不需要真的让它来做你想做的事。我测试了一种方法,它需要创建一个表视图子类来使用mouse-moved方法进行跟踪。下面是该子类的代码:

-(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];
}
我将数组和表委托以及数据源代码放在app委托中,这可能不是最好的地方,但可以进行测试

- (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中设置了标识符链接,则执行该操作。

我不确定获取该单元格的方法有何问题,但您不需要通过获取该方法来完成所需操作。我测试了一种方法,它需要创建一个表视图子类来使用mouse-moved方法进行跟踪。下面是该子类的代码:

-(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];
}
我将数组和表委托以及数据源代码放在app委托中,这可能不是最好的地方,但可以进行测试

- (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中设置了标识符链接,则执行该操作。

Hey!不如给@rdelmar一些反馈,让他给出详尽的答案!别忽视他,嘿!不如给@rdelmar一些反馈,让他给出详尽的答案!别忽视他,对不起!这真的帮助我开始了。我最终创建了一个子类NSTextField来以文本为中心绘制单元格,并设置其悬停属性,这样当tableview在willDisplayCell方法中通知特定单元格它被悬停在其上方时,我就可以让该特定单元格用下划线重绘自身。然后,我为单元格设置hitTest,以便在用户单击文本内部时执行所需的任何选择器。再次感谢你的回答!很抱歉这真的帮助我开始了。我最终创建了一个子类NSTextField来以文本为中心绘制单元格,并设置其悬停属性,这样当tableview在willDisplayCell方法中通知特定单元格它被悬停在其上方时,我就可以让该特定单元格用下划线重绘自身。然后,我为单元格设置hitTest,以便在用户单击文本内部时执行所需的任何选择器。再次感谢你的回答!