Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-在NSTableView中使用复选框获取行索引_Swift_Cocoa_Checkbox_Nstableview - Fatal编程技术网

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

Swift-在NSTableView中使用复选框获取行索引,swift,cocoa,checkbox,nstableview,Swift,Cocoa,Checkbox,Nstableview,我正在斯威夫特学习可可。我使用Viewbased创建了一个NSTableView 我还将复选框操作连接到ViewController。但是当我点击复选框时,它打印了-1而不是行索引。我必须先选择行,然后单击复选框以获得正确的索引号。每行上的每个复选框或按钮是否都可以获取行索引?这是我的密码: 进口可可 let data: [String] = ["Apple", "Microsoft", "IBM", "Tesla", "SpaceX", "Boeing" , "Nasa"] class

我正在斯威夫特学习可可。我使用Viewbased创建了一个NSTableView

我还将复选框操作连接到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)
}

}

这就是您想要的,但是更好的实现是将action与NSTableCellView子类一起使用

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

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

我只能基于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创建子类。

选中的iAction应该转到NSTableCellView子类。感谢您的指导。我是可可豆开发新手。我没有找到任何有关高级nstableview的教程。您能告诉我如何创建一个子类吗?首先,您将创建一个新的file->Cocoa类(基于NSTableCellView)。然后在Interface Builder中将子类指定给表视图单元。现在,您可以在子类中设置IBOutlets/IBActions,将其连接到表单元格中的控件。如果在单元格视图子类或表视图控制器中执行操作很有用,则这取决于您将要执行的所有操作,但在大多数情况下,您将为表视图单元格指定一个objectValue并对其进行操作。我确实遵循了您的指导,但仍停留在control+上,将outlet和操作拖动到子类文件。这是Xcode的错误吗?我使用的是Xcode 8.3.3,因为这个版本允许我连接到iTunes library framework,没有任何问题。如果在助手编辑器中打开新创建的子类,它应该可以使用控件拖动。请注意在IB中选择右侧控件。在某些情况下,在左侧的大纲视图中选择控件并从中拖动连接(IBAction)更容易。