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
协议的新方法。所以,它永远不会被调用。
我已经搜索过答案,但我在这里和网上找到的大多数示例都是针对 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
协议的新方法。所以,它永远不会被调用。