双击Cocoa中的NSTableView行?

双击Cocoa中的NSTableView行?,cocoa,nstableview,double-click,Cocoa,Nstableview,Double Click,当用户双击NSTableView中的一行时,我需要我的应用程序打开一个窗口。我很难找到关于如何实现这一点的信息或示例。有人能给我指出正确的方向吗?看看NSTableView上的方法;您可以将其设置为一个方法,该方法将像普通的目标操作系统一样被调用,但只需双击即可 在该操作方法中,将非常有用。为@JimPuls answer添加更多基本信息,以利于其他Cocoa新手 需要在接口中声明NSTableView的IBOutlet。我认为最好在表的委托中这样做。 需要通过Interface Builder

当用户双击NSTableView中的一行时,我需要我的应用程序打开一个窗口。我很难找到关于如何实现这一点的信息或示例。有人能给我指出正确的方向吗?

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


在该操作方法中,将非常有用。

为@JimPuls answer添加更多基本信息,以利于其他Cocoa新手

需要在接口中声明NSTableView的IBOutlet。我认为最好在表的委托中这样做。 需要通过Interface Builder将IBOutlet连接到表。为此,在IB中按住Ctrl键将声明出口的类拖放到表视图。当您释放鼠标时,弹出窗口应显示您在步骤1中声明的出口名称。选择那个。 在@implementation部分的-awakeFromNib方法上,在步骤1中声明并在步骤2中连接的IBOutlet上调用-setTarget:和-setDoubleAction:。 下面是我的表视图代表的摘录。我还将委托设置为数据源,因此您将看到与其关联的NSTableViewDelegate和NSTableViewDataSource接口

//接口摘录

@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

希望这有帮助。

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

-(IBAction)openWindow:(id)sender
在.m文件中实现相同的功能

-(IBAction)openWindow:(id)sender
{
    //do something here;
}
到达您的表视图所在的nib,选择表视图并获得属性检查器绑定的第二个最后选项卡,打开双击参数公开三角形复选框绑定到复选框选择文件的所有者,模型键路径应为self,选择器名称将为openWindow:,与双击目标公开的过程相同,
这将起作用

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

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

>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:
其中myMethod实现为

- (void)myMethod:(NSArray*)selectedObjects
{
    NSLog(@"%@", selectedObjects);
}
这也记录在这里:
如果有人在寻找swift 2.0版本: 这对我来说很有用。似乎比目标C代码简单得多

@IBOutlet weak var searchResultTable: NSTableView!

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

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

可以在Interface Builder中连接双击操作。控件单击您的表视图确保您获得的是表视图,而不是滚动视图、剪辑视图或表列以获取其连接面板。在“已发送操作”部分中找到“doubleAction”项。将其连接到您选择的iAction。

在SWIFT 4.1上 您可以在代码中设置TableView对象的doubleAction方法,通过使用selectornameOfYourFunction来执行@objc函数

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

然后在prepare for segue上为新窗口执行所有设置:

首先,关于Interface Builder:

当然,为该序列指定一个标识符:

接下来,在第一个视图控制器中,表视图是代码:

 //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
        }
然后我们需要一个函数来执行表视图双击的顺序,这个函数是用选择器调用的,因此需要对目标C可见,即使我们正在用Swift编程,我们只需用@Objc启动函数即可

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

更新了阿尔弗雷德对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)")
}

有没有办法通过IB将其连接起来?还记得用setTarget:设置表视图的目标,这很愚蠢,但是如果您将-setDoubleAction:作为委托方法实现,或者您应该创建一个IBOutlet iVar到表,并在iVar上调用-setDoubleAction:@IvanVučica Yes,您可以在IB中连接它。请参阅。@robmayoff 5年后\o/这非常有用。如果您想了解更多有关doubleAction的信息,请查看此信息。对于Swift 3,函数选择器将是SearchResultable。doubleAction=selector或DoubleClickOnResultRoweasy squeezy lemon peasy。您可以从表视图的clickedRow方法中单击行。您仍然需要答案2中所述的出口。您不一定需要连接到表视图的出口,因为表视图将自身作为操作消息的发送方参数提供。如果突然无法再选择行,您可能忘记了:在选择器名称之后。。。
@IBOutlet weak var searchResultTable: NSTableView!

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

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