双击Cocoa中的NSTableView行?

时间:2009-03-06 22:05:09

标签: cocoa nstableview double-click

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

8 个答案:

答案 0 :(得分:126)

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

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

答案 1 :(得分:54)

为@JimPuls答案添加更多基本信息,以便其他新人加入Cocoa。

  1. 需要在接口中声明NSTableView的IBOutlet。我认为最好在表的委托中这样做。
  2. 需要通过Interface Builder连接到表的IBOutlet。要做到这一点,请按Ctrl-Drag&从声明出口到表视图的类中删除IB。释放鼠标时,弹出窗口应显示您在步骤1中声明的插座名称。选择那个。
  3. 在@implementation部分的-awakeFromNib方法中,在步骤#1中声明的IBOutlet上调用-setTarget:和-setDoubleAction:并在步骤#2中连接。
  4. 这是我的表格视图委托的摘录。我的代理也设置为数据源,这就是为什么你会看到与之关联的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...
    }
    

    希望这有帮助。

答案 2 :(得分: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:
    
  2. 将myMethod实现为

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

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

答案 3 :(得分:7)

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

@IBOutlet weak var searchResultTable: NSTableView!

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

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

答案 4 :(得分:6)

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

答案 5 :(得分:1)

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

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

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

首先在Interface Builder上:

enter image description here

当然为该segue提供一个标识符:

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
        }

然后我们需要一个函数在表视图上执行segue的双击,这个函数用#selector调用,因此需要对Objective 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)
}

答案 6 :(得分:0)

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

-(IBAction)openWindow:(id)sender
<。>在.m文件中实现相同的

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

到你的表视图存在的那个nib,选择表视图并获得属性检查器的第二个最后一个选项卡,打开双cicl参数显示三角形检查绑定检查狐狸选择文件的所有者,模型键pat应该是“self “,选择器名称将为”openWindow:“,同样的过程与”双击目标“公开, 这将有效

答案 7 :(得分:0)

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