当用户双击中的一行时,我需要我的应用程序打开一个窗口NSTableView
。我很难找到有关如何完成此操作的信息或示例。有人能指出我正确的方向吗?
Answers:
看一下-setDoubleAction:
NSTableView上的方法;您可以将其设置为将被调用的方法,就像通常的目标操作系统一样,但是双击即可。
在该动作方法中,-clickedRow
将很有用。
在@JimPuls答案中添加更多基本信息,以使可可的其他新手受益。
这是我的表视图代表的节选。我也将我的代表设置为数据源,因此这就是为什么您会看到与其关联的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...
}
希望这可以帮助。
正如PR Singh所说,您可以使用可可粉绑定,也可以传递selectedObjects。
在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
如果有人需要快速的2.0版本:这对我有用。似乎比Objective C代码容易得多。
@IBOutlet weak var searchResultTable: NSTableView!
override func viewDidLoad() {
super.viewDidLoad()
searchResultTable.doubleAction = "doubleClickOnResultRow"
}
func doubleClickOnResultRow()
{
print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
doubleAction
请查看此链接。
searchResultTable.doubleAction = #selector(doubleClickOnResultRow)
您可以在Interface Builder中连接双击动作。按住Control键并单击表视图(确保获得表视图,而不是滚动视图或剪辑视图或表列)以获取其连接面板。在“已发送的操作”部分中找到“ doubleAction”项。将其连接到您选择的IBAction。
在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)
}
更新了阿尔弗雷德·斯威夫特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)")
}