11

我有一个 NSTableView ,我想获取单元格中存在的值。我只有一列,所以我只需要行号

我可以使用这个[tableView selectedRow]-但是我把它放在哪里我想把它放在一个在选择任何行时被调用的方法中。

-(void)tableViewSelectionDidChange:(NSNotification *)notification{

NSLog(@"%d",[tableViewController selectedRow]);

}

上述方法也不起作用我收到错误 -[NSScrollView selectedRow]: unrecognized selector sent to instance 0x100438ef0]

我想要类似 iPhone tableview 中可用的方法-

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  {
}
4

6 回答 6

31

什么是tableViewController对象?只有NSTableView实例响应selectedRownotification您可以从的 object 属性获取当前表视图(发送通知的表视图) :

目标-C:

-(void)tableViewSelectionDidChange:(NSNotification *)notification{
    NSLog(@"%d",[[notification object] selectedRow]);
}

迅速:

func tableViewSelectionDidChange(notification: NSNotification) {
    let table = notification.object as! NSTableView
    print(table.selectedRow);
}
于 2012-05-29T09:57:13.713 回答
3

Xcode 10/swift 4.2 我的 2 美分

  func tableViewSelectionDidChange(_ notification: Notification) {
        guard let table = notification.object as? NSTableView else {
            return
        }
        let row = table.selectedRow
        print(row)
    }
于 2019-02-09T12:13:03.057 回答
2

Swift 5.4中:

只需使用tableView.action = #selector(YOUR_METHOD), 然后在您的方法中尝试使用tableView.selectedRow.

这只会解决问题。看看下面的演示:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.

    tableView.action = #selector(didSelectRow)
}

@objc private func didSelectRow() {
    print("Selected row at \(tableView.selectedRow)")
}

但请注意,如果没有选择任何内容,或者您​​在单元格外部单击,那么您将tableView.selectedRow获得-1。所以你可能想在使用它之前检查索引是否超出范围。:)

于 2021-12-20T06:16:48.693 回答
1

Swift 3(来自 Eimantas 的回答):

func tableViewSelectionDidChange(_ notification: NSNotification) {
    let table = notification.object as! NSTableView
    print(table.selectedRow);
}
于 2017-05-07T21:06:05.043 回答
0

你应该像这样添加观察者通知

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(tableViewSelectionDidChangeNotification)
                                             name:NSTableViewSelectionDidChangeNotification object:nil];

当 tableView 选择行时它将起作用

祝你好运

于 2018-05-18T03:25:46.270 回答
0

Swift 5中的完整指南:

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.didSelectRow(_:)), name: NSTableView.selectionDidChangeNotification, object: tableView)
    }



    @objc
    func didSelectRow(_ noti: Notification){
        guard let table = noti.object as? NSTableView else {
            return
        }
        let row = table.selectedRow
        print(row)
    }


    deinit {
        NotificationCenter.default.removeObserver(self)
    }
于 2020-03-02T03:59:00.457 回答