NSTableView,didSelectRowAt 没有被击中

NSTableView, didSelectRowAt not being hit

我已经搜索过答案,但我在这里和网上找到的大多数示例都是针对 IOS 的,我正在尝试 OSX,抱歉,我还不够高级,无法理解 IOS 我在网上找到的例子。

我可以填充 table,所以我知道代理正在工作。但是 didSelectRowAt 没有被击中?

这是我的代码,它来自我在网上找到的一个示例,并试图实现 didSelectRowAt。

import Cocoa

struct Task {
    var schedule: String
    var description: String
}

class ViewController: NSViewController {

    @IBOutlet var tableView: NSTableView!
    
    var items = [Task(schedule: "8:00 - 9:00", description: "Hacer ejercicios"),
                 Task(schedule: "9:00 - 13:00", description: "Trabajar")]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Add this

        self.tableView.reloadData() // RECON THIS LOADS THE DATA TO TABLE
    }

    @IBAction func button(_ sender: Any) {
        tableView.delegate = self
        tableView.dataSource = self
        

        
    }
}





extension ViewController: NSTableViewDelegate, NSTableViewDataSource {
    
    func tableView(_ tableView: NSTableView, didSelectRowAt indexPath: IndexPath) {
        
        print("Test")
    }
    
    
    func numberOfRows(in tableView: NSTableView) -> Int {
        return self.items.count
    }
    
    
    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        let currentItem = self.items[row]
        
        if tableColumn?.identifier == NSUserInterfaceItemIdentifier(rawValue: "scheduleColumn") {
            
            let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "scheduleCell")
            guard let cellView = tableView.makeView(withIdentifier: cellIdentifier, owner: self) as? NSTableCellView else {
                return nil
            }
            cellView.textField?.stringValue = currentItem.schedule
            return cellView
            
        } else if tableColumn?.identifier == NSUserInterfaceItemIdentifier(rawValue: "descriptionColumn") {
            let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "descriptionCell")
            guard let cellView = tableView.makeView(withIdentifier: cellIdentifier, owner: self) as? NSTableCellView else {
                return nil
            }
            cellView.textField?.stringValue = currentItem.description
            return cellView
        }
        
        return nil
    }
    
}

我对 swift 很陌生。所以请保持友善,

您使用了错误的委托方法。试试这个:

func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
        
    print("Selected")
        
    return true
}

我假设您正在查看 iOS UITableView 方法 tableView(_:didSelectRowAt:):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { }

仅仅将 UITableView 更改为 NSTableView 是行不通的 - 这样,您就创建了一个不属于 NSTableViewDelegate 协议的新方法。所以,它永远不会被调用。