【问题标题】:Swift - Get row index with checkbox in NSTableView [duplicate]Swift - 在 NSTableView 中使用复选框获取行索引 [重复]
【发布时间】:2018-06-23 01:42:06
【问题描述】:

我正在学习 Swift 中的 Cocoa。我创建了一个基于 View 的 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)
}

}

【问题讨论】:

  • CheckClicked IBAction 应该转到 NSTableCellView 子类。

标签: swift cocoa checkbox nstableview


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的指导。我是新手可可开发人员。我没有找到任何高级 nstableview 的教程。你能告诉我如何创建一个子类吗?
  • 首先您将创建一个新文件 -> Cocoa 类(基于 NSTableCellView)。其次,您将子类分配给 Interface Builder 中的表格视图单元格。现在您可以在子类中设置 IBOutlets / IBActions 以将其连接到表格单元格中的控件。如果在单元格视图子类或表格视图控制器中执行操作很有用,这取决于您将要做什么,但在大多数情况下,您会将 objectValue 分配给表格视图单元格并对其进行操作。
  • 好吧,我确实遵循了您的指导,但卡在了控制+拖动出口和对子类文件的操作。这是 Xcode 的错误吗?我使用的是 Xcode 8.3.3,因为这个版本允许我毫无问题地连接到 iTunes 库框架。
  • 如果您在助手编辑器中打开新创建的子类,它应该可以使用控件拖动。注意在 IB 中选择正确的控件。在某些情况下,在左侧的大纲视图中选择控件并从那里拖动连接 (IBAction) 会更容易。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多