Swift-使用NSTableView中的复选框获取行索引

时间:2018-06-23 01:42:07

标签: swift cocoa checkbox nstableview

我正在Swift中学习可可。我创建了一个基于ViewBase的NSTableView。

Simple tableview

我还将复选框动作连接到ViewController。但是,当我单击复选框时,它打印了-1而不是行索引。我必须先选择该行,然后单击复选框以获取正确的索引号。无论如何,每行的每个复选框或按钮都获得行索引吗?这是我的代码:

进口可可粉

let data: [String] = ["Apple", "Microsoft", "IBM", "Tesla", "SpaceX", 
"Boeing" , "Nasa"]

class ViewController: NSViewController, NSTableViewDelegate, 
NSTableViewDataSource {

override func viewDidLoad() {
    super.viewDidLoad()

    self.table.delegate = self
    self.table.dataSource = self
    self.table.reloadData()
    // Do any additional setup after loading the view.
}
@IBOutlet weak var table: NSTableView!


@IBAction func CheckClicked(_ sender: Any) {
    print(self.table.selectedRow)
}

override var representedObject: Any? {
    didSet {
    // Update the view, if already loaded.
    }
}

func numberOfRows(in tableView: NSTableView) -> Int {
    return data.count
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: 
NSTableColumn?, row: Int) -> NSView? {
    if (tableColumn?.identifier)!.rawValue == "NameColumn"
    {
        if let cell = tableView.makeView(withIdentifier: 
NSUserInterfaceItemIdentifier(rawValue: "NameColumn"), owner: self) 
as? NSTableCellView
        {
            cell.textField?.stringValue = data[row]
            return cell
        }
    }
    else if (tableColumn?.identifier)!.rawValue == "CheckColumn"
    {
        if let cell = tableView.makeView(withIdentifier: 
NSUserInterfaceItemIdentifier(rawValue: "CheckColumn"), owner: self) 
as? NSButton
        {

            return cell
        }
    }
    return nil
}

func tableViewSelectionDidChange(_ notification: Notification) {
    print(self.table.selectedRow)
}

}

2 个答案:

答案 0 :(得分:0)

这是您要寻找的,但是更好的实现是将动作与NSTableCellView子类一起使用。

   @IBAction func CheckClicked(_ sender: NSButton) {
        // print(self.table.selectedRow)

        let row = table.row(for: sender)
        print("Button row \(row)")
    }

答案 1 :(得分:0)

我只能基于NSButton创建一个子类。

class myCustomView: NSButton{
    @IBOutlet weak var CheckButton: NSButtonCell!
}

尽管我不能更改这些按钮单元的标题。

if (tableColumn?.identifier)!.rawValue == "CheckColumn"
{
    if let cell = tableView.makeView(withIdentifier:
        NSUserInterfaceItemIdentifier(rawValue: "CheckColumn"), owner: self)
        as? myCustomView
        {
            cell.CheckButton.title = data[row]
            return cell
        }
}

我不知道为什么Xcode不让我创建基于NSTableCellView的子类。