双击Cocoa中的NSTableView行?

All*_*lyn 70 cocoa double-click nstableview

当用户双击一行中的一行时,我需要我的应用程序打开一个窗口NSTableView.我在寻找有关如何实现这一目标的信息或示例时遇到了一些困难.任何人都能指出我正确的方向吗?

Jim*_*uls 131

看看-setDoubleAction:NSTableView 上的方法; 你可以将它设置为一个方法,就像普通的目标 - 动作系统一样,但是双击一下.

在那个动作方法中,-clickedRow将是有用的.

  • 还记得用setTarget设置表视图的目标:傻但可以忽略 (24认同)
  • 有没有办法通过IB连接? (7认同)
  • @IvanVučica是的,你可以在IB中连接它.见[本回答](http://stackoverflow.com/a/33645158/77567). (2认同)
  • @robmayoff 5年后\ o / (2认同)

ama*_*sta 55

将更多基本信息添加到@JimPuls答案,以便其他新人可以获益.

  1. 需要在接口中声明NSTableView的IBOutlet.我认为最好在表的委托中这样做.
  2. 需要通过Interface Builder连接到表的IBOutlet.要在IB中执行Ctrl-Drag&Drop,从声明出口的类到表视图.释放鼠标时,弹出窗口应显示您在步骤1中声明的插座名称.选择那个.
  3. 在@implementation部分的-awakeFromNib方法中,在步骤#1中声明的IBOutlet上调用-setTarget:和-setDoubleAction:并在步骤#2中连接.

这是我的表视图委托的摘录.我的代理也设置为数据源,这就是为什么你会看到与它相关的NSTableViewDelegate和NSTabeViewDataSource接口.

//界面摘录.

@interface MyTableViewDelegate : NSObject <NSTableViewDelegate, NSTableViewDataSource>
{
  // This iVar needs to be connected to the table view via the IB.
  IBOutlet NSTableView *tableOutlet;
}

@property (assign) IBOutlet NSTableView *tableOutlet;

- (void)doubleClick:(id)nid;

@end
Run Code Online (Sandbox Code Playgroud)

//实施摘录.

@implementation MyTableViewDelegate

@synthesize tableOutlet = _tableOutlet;

- (void)awakeFromNib {
  [_tableOutlet setTarget:self];
  [_tableOutlet setDoubleAction:@selector(doubleClick:)];
}

- (void)doubleClick:(id)object {
  // This gets called after following steps 1-3.
  NSInteger rowNumber = [_tableOutlet clickedRow];
  // Do something...
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Geo*_*ope 10

正如PR Singh所说,你可以使用cocoa绑定,你也可以传递selectedObjects.

  1. 在IB中选择表视图,然后在Bindings检查器中设置这两个绑定,如下所示:

    >Double Click Target
    
    bind to = Application delegate object (or file owner)
    model key path = self
    selector name = myMethod:
    
    >Double Click Argument
    
    bind to = array controller
    controller key = selectedObjects
    selector name = myMethod:
    
    Run Code Online (Sandbox Code Playgroud)

myMethod的实现方式

- (void)myMethod:(NSArray*)selectedObjects
{
    NSLog(@"%@", selectedObjects);
}
Run Code Online (Sandbox Code Playgroud)

这也记录在这里:https: //developer.apple.com/library/mac/qa/qa1472/_index.html


小智 8

如果有人寻找swift 2.0版本:这对我有用.看起来比Objective C代码容易得多.

@IBOutlet weak var searchResultTable: NSTableView!

override func viewDidLoad() {
    super.viewDidLoad()
    searchResultTable.doubleAction = "doubleClickOnResultRow"
}

func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
Run Code Online (Sandbox Code Playgroud)

  • 对于 Swift 3,函数选择器将是 `searchResultTable.doubleAction = #selector(doubleClickOnResultRow)` (3认同)

rob*_*off 6

您可以在Interface Builder中连接双击操作.按住Control键并单击表视图(确保获取表视图,而不是滚动视图或剪辑视图或表列)以获取其连接面板.在"已发送操作"部分中找到"doubleAction"项.将其连接到您选择的IBAction.

  • 您不一定需要连接到表视图的插座,因为表视图将自身提供为操作消息的发送者参数。 (2认同)

iph*_*aaw 5

更新了 Alfred 对 Swift 5 的回答

@IBOutlet weak var searchResultTable: NSTableView!

override func viewDidLoad() {
    super.viewDidLoad()
    searchResultTable.target = self
    searchResultTable.doubleAction = #selector(doubleClickOnResultRow)
}

@objc func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
Run Code Online (Sandbox Code Playgroud)