原来的解决方案带来了新的问题。
NSTokenFieldCell
中未完全显示时,NSTableView
进入编辑状态再退出会导致表格视图显示异常。
所以我反复尝试获得更好的解决方案:
class MyTokenFieldCell: NSTokenFieldCell {
override func fieldEditor(for controlView: NSView) -> NSTextView? {
return nil;
}
}
可能是NSTableView
的编辑器重用机制NSTokenFieldCell
有问题,导致程序崩溃。
fieldEditorForView:这里被覆盖,返回nil,应该会导致每次编辑时都要重新创建编辑器,避免重用,从而解决crash问题。
以下是原答案。
⚠️因为解决方案导致其他问题,请忽略。
我也遇到了这个问题。我的解决方案是暂时保留表格视图使用的单元格。
自定义NSTokenFieldCell:每次拷贝后,临时保存拷贝。
class MyTokenFieldCell: NSTokenFieldCell {
static var cells = [NSUserInterfaceItemIdentifier: [MyTokenFieldCell]]()
override func copy(with zone: NSZone? = nil) -> Any {
let cell = super.copy(with: zone)
guard let tokenFieldCell = cell as? MyTokenFieldCell else { return cell }
tokenFieldCell.identifier = self.identifier
guard let identifier = tokenFieldCell.identifier else { return cell }
var cells = MyTokenFieldCell.cells[identifier] ?? []
cells.append(tokenFieldCell)
if cells.count > 4 {
cells.removeFirst()
}
MyTokenFieldCell.cells[identifier] = cells
return cell
}
}
实现 的tableView(_:dataCellFor:row:)
方法NSTableViewDelegate
,提供MyTokenFieldCell
表格视图,并将标识符设置为:<columnIdentifier>:<row>
extension ViewController: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, dataCellFor tableColumn: NSTableColumn?, row: Int) -> NSCell? {
guard let columnIdentifier = tableColumn?.identifier, columnIdentifier.rawValue == "token" else {
return tableColumn?.dataCell(forRow: row) as? NSCell
}
let cell = MyTokenFieldCell()
cell.isEditable = true
cell.identifier = .init("\(columnIdentifier.rawValue):\(row)")
return cell
}
}