75

当用户双击NSTableView. 我很难找到有关如何完成此操作的信息或示例。谁能指出我正确的方向?

4

8 回答 8

138

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

在那个动作方法中,-clickedRow会很有用。

于 2009-03-06T22:18:18.693 回答
56

为 Cocoa 的其他新人添加更多基本信息到 @JimPuls 答案。

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

这是我的表视图委托的摘录。我将我的委托也设置为数据源,这就是为什么您会看到与其关联的 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

// 实现摘录。

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

希望这可以帮助。

于 2011-12-04T22:14:57.497 回答
12

如果有人在寻找 swift 2.0 版本:这对我有用。似乎比 Objective C 代码容易得多。

@IBOutlet weak var searchResultTable: NSTableView!

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

func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
于 2015-09-22T20:28:27.853 回答
10

正如 PR Singh 所说,您可以使用可可绑定,也可以传递 selectedObjects。

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

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

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

于 2014-03-25T14:17:27.627 回答
8

您可以在 Interface Builder 中连接双击操作。按住 Control 并单击您的表格视图(确保您获得的是表格视图,而不是滚动视图或剪辑视图或表格列)以获取其连接面板。在“Sent Actions”部分找到“doubleAction”项。将其连接到您选择的 IBAction。

于 2015-11-11T06:10:27.030 回答
4

更新了 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)")
}
于 2019-10-26T09:44:36.737 回答
1

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

-(IBAction)openWindow:(id)sender

在 .m 文件中实现相同

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

到达您的表格视图所在的笔尖,选择表格视图并获得属性检查器的倒数第二个选项卡(绑定),打开double click argument披露三角形检查绑定到复选框选择文件的所有者,模型键路径应该是“自我”,选择器名称将是“openWindow:”,与“双击目标”披露相同的过程,这将起作用

于 2013-09-23T12:59:52.087 回答
1

在 SWIFT 4.1 上,您在代码中设置 TableView 对象的 doubleAction 方法,以使用 #selector(nameOfYourFunction) 执行 @objc 函数

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

然后为准备 segue 的新窗口进行所有设置:

好的,首先在 Interface Builder 上:

在此处输入图像描述

当然给那个segue一个标识符:

在此处输入图像描述

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

 //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
        }

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

@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)
}
于 2018-04-06T03:25:01.567 回答