双击 Cocoa 中的 NSTableView 行?

当用户双击 NSTableView中的一行时,我需要我的应用程序打开一个窗口。我有一个有点困难的时间找信息或例子如何完成这一点。有人能告诉我正确的方向吗?

31010 次浏览

看一下 NSTableView 上的 -setDoubleAction:方法; 您可以将其设置为一个方法,该方法将被调用,就像普通的目标操作系统一样,但需要双击。

在该操作方法中,-clickedRow将是有用的。

向@JimPuls 添加更多基本信息,可以让 Cocoa 的其他新用户受益。

  1. NSTableView 的 IBOutlet 需要在接口中声明。我认为最好是在表的委托中这样做。
  2. 到桌子的 IBoutlet 需要通过 Interface Builder 连接。在 IB 中从声明表视图出口的类中执行 Ctrl-Drag & Drop 操作。当你释放你的鼠标时,会出现一个弹出窗口,上面有你在步骤 # 1中声明的出口名称。选那个。
  3. 在@實現部分-awakeFromNib 方法上,在步骤 # 1中声明并在步骤 # 2中连接的 IBOutlet 上,call-setTarget: and-setDoubleAction: 。

下面是我的表视图委托的摘录。我还将我的委托设置为数据源,这就是为什么您将看到与它关联的 NSTableView氏委托和 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

//执行摘录。

@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...
}

希望这个能帮上忙。

您可以对绑定做同样的事情,首先在.h 文件中声明一个 mentod

-(IBAction)openWindow:(id)sender

在.m 文件中实现相同的

-(IBAction)openWindow:(id)sender
{
//do something here;
}

到达表格视图所在的笔尖,选择表格视图,获得属性检查器(绑定)的第二个最后一个标签,打开 double click argument披露三角形检查绑定到复选框选择文件的所有者,模型键路径应该是“ self”,选择器名称应该是“ openWindow:”,同样的过程做“双击目标”披露, 会成功的

正如 PR Singh 所说,您可以使用可可绑定,也可以传递选定的对象。

  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:
    

Where myMethod is implemented as

- (void)myMethod:(NSArray*)selectedObjects
{
NSLog(@"%@", selectedObjects);
}

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

如果有人在寻找一个快速的2.0版本: 这对我来说很有用,看起来比目标 C 代码简单多了。

@IBOutlet weak var searchResultTable: NSTableView!


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


func doubleClickOnResultRow()
{
print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}

你可以在 Interface Builder 中连接双击动作。控件单击表视图(确保获取的是 桌面视图,而不是滚动视图、剪辑视图或表列)以获取其连接面板。在“ Sent Actions”部分中找到“ doubleAction”项。将它连接到您选择的 IBAction。

在 SWIFT 4.1上 在代码中设置 TableView 对象的 doubleAction 方法,通过使用 # 选择器(nameOfYourfunction)执行@objecc 函数

在这个函数中称为 segue。 您可以将新窗口链接到 InterfaceBuilder 上的原始窗口(不是 NSTableView 对象,而是实际的 ViewController 对象)。

然后为新窗口做所有的准备工作,准备接下来的内容:

好的,首先是 Interface Builder:

enter image description here

当然,我们要给出一个标识符:

enter image description here

接下来,在我们的第一个视图控制器(表视图所在的位置)中的代码:

 //We use this function: prepare for segue
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
// check if we are referring to the actual segue we want
if segue.identifier?.rawValue == "segueToYourNewWindow" {
// now create a reference to that new window
let yourNewWindow = segue.destinationController as! newWindowViewController
// now change variables inside that view controller code, remember that the objects might fail if they are not yet visible to the user so first set up the variables or call them using the main thread, up to your design.
yourNewWindow.selectedRowVariable = thisTableView.clickedRow
}

然后我们需要一个函数来执行表格视图的双击,这个函数是用 # 选择器调用的,因此需要对 Objective C 可见(即使我们在 Swift 中编程) ,我们只是简单地用@Objective 启动这个函数。

@objc func doubleClickOnResultRow() {
//beware of double-clicking also triggers this function when no rows is selected with the selectedRow being -1
if (thisTableView.selectedRow > -1 ) {
performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "segueToYourNewWindow"), sender: nil)
}
}

最后,在代码的初始设置部分,我们将这个函数设置为 TableView 的 doubleAction 方法,如下所示:

override func viewDidLoad() {
super.viewDidLoad()
thisTableView.doubleAction = #selector(doubleClickOnResultRow)
}

更新了 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)")
}