5

我正在构建 MacOS 应用程序。当我按下添加按钮时,我正在尝试制作更新单元格的表格视图。

在此处输入图像描述

以下是我的代码:

 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let identifier = tableColumn?.identifier as NSString?
    if ( identifier == "NameCell")
    {
        var result: NSTableCellView
        let cell = tableView.make(withIdentifier: "NameCell", owner: self) as! NSTableCellView
        cell.textField?.stringValue = self.data[row].setting!
            return cell

    }
    else if (identifier == "SettingCell")
    {
        if let cell = tableView.make(withIdentifier: "SettingCell", owner: self) as? NSTableCellView {
        cell.textField?.stringValue = self.data[row].setting!
        return cell
    }
    }
    return nil
}

但是,行 let cell = tableView.make(withIdentifier: "NameCell", owner: self) as!NSTableCellView 一直失败,因为它返回 nil

致命错误:在展开可选值时意外发现 nil

NameCell 来自 在此处输入图像描述 任何人都可以帮我找到解决这个问题的方法吗?

4

2 回答 2

10

NSTableView对于在尝试以完全编程方式制作时遇到同样问题的其他人:除非给定标识符存在相应的 NIB,否则makeView(withIdentifier:owner:)将返回:nil

NSTableView文档:

如果无法从 nib 文件中实例化具有指定标识符的视图或无法在重用队列中找到具有指定标识符的视图,则此方法返回nil.

同样,“所有者”参数是一个特定于 NIB 的概念。简而言之:如果NSTableView以编程方式填充单元格,则不能使用此方法。

在这个答案中,我详细介绍了 Swift 代码以NSTableCellView编程方式生成:https ://stackoverflow.com/a/51736468/5951226

但是,如果您不想要 an 的所有功能NSTableViewCell,请注意您可以返回任何 NSViewin tableView(_:viewFor:row:)。因此,根据CocoaProgrammaticHowtoCollection,您可以简单地编写:

let cell = NSTextField()
cell.identifier = "my_id" // Essential! Allows re-use of the instance.
// ... Set any properties you want on the NSTextField.
return cell
于 2018-08-07T23:07:23.400 回答
5

您应该在 NSTableCellView 中使用“NameCell”设置“标识符”。由于列的标识符永远不会改变,因此您的代码应简化如下:

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    var result: NSTableCellView
    let cell = tableView.make(withIdentifier: "NameCell", owner: self) as! NSTableCellView
    cell.textField?.stringValue = self.data[row].setting!

    return cell
}

XCode Interface Builder 中的参考设置: 在此处输入图像描述

于 2017-08-09T02:35:40.877 回答