【问题标题】:Get notified for selecting a row in NSTableView在 NSTableView 中选择一行时收到通知
【发布时间】:2014-01-15 19:22:49
【问题描述】:

到目前为止,我正在使用tableViewSelectionDidChange 通知来检测用户何时单击NSTableView 中的任何行。但是使用这个通知委托我需要取消选择选定的行[tableView deselectRow:[tableView selectedRow]],因为它不会通知,直到另一行被选中。

这种方法的问题是,一旦我取消选择一行tableViewSelectionDidChange 将再次收到通知,现在我需要检查selectedRow 是否为-1(因为取消选择后没有选择行,它现在将返回 - 1)

NSTableView 中的 tableView:didSelectRowAtIndexPath 是否与 UITableView 中的等价物?如果没有,有没有更好的方法在选择同一行时获得通知?

【问题讨论】:

  • 我认为您的方法没有问题,如果 3 行额外的代码可以满足您的需求,请继续使用它。
  • 我不明白“我需要取消选择选定的行”。这应该是自动的,不是吗?
  • @trojanfoe 只有当你选择另一行时它是自动的,如果我再次选择同一行它不会发布通知。这对于基于单元格的表格通常是可以接受的,但在我的情况下,即使单击同一行,我也需要多次触发通知。为此,我需要取消选择行以获取多个通知。

标签: macos nstableview


【解决方案1】:

我也遇到了同样的问题,最后也来到了这里。

我有一个场景,我有一个歌曲播放列表。我希望在一首歌曲中将状态设为“已选择”,但能够停止该歌曲并再次播放选择 tableview 的单元格。

我最终使用了我在Peter Lapisu 看到的here in stackoverflow 的解决方案。

基本上,Peter 建议扩展 tableview 创建一个extendedDelegate 属性,该属性具有- (void)tableView:(NSTableView *)tableView didClickedRow:(NSInteger)row; 方法。然后像这样覆盖mouseDown 事件:

- (void)mouseDown:(NSEvent *)theEvent {

    NSPoint globalLocation = [theEvent locationInWindow];
    NSPoint localLocation = [self convertPoint:globalLocation fromView:nil];
    NSInteger clickedRow = [self rowAtPoint:localLocation];

    [super mouseDown:theEvent];

    if (clickedRow != -1) {
        [self.extendedDelegate tableView:self didClickedRow:clickedRow];
    }
}

【讨论】:

    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多