我有一个简单的测试程序,它有一个 2 列 NSTableView(基于视图),两列的单元格都设置为 NSTokenFieldCell。我在这个控制器中也有一个 NSTokenField
我希望能够将令牌从表中拖放到字段中。当我有 1 列时,它运行良好。现在我有 2 列我需要知道要添加到字段中的标记
示例代码:
class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate, NSTokenFieldDelegate {
@IBOutlet weak var tableView: NSTableView!
@IBOutlet weak var tokenField: NSTokenField!
let tokens = ["tok1","tok2","tok3","tok1","tok2","tok3","tok1","tok2","tok3","tok1","tok2","tok3","tok1","tok2","tok3","tok1","tok2","tok3"]
let tokens2 = ["image","date","time","folder"]
override func viewDidLoad() {
super.viewDidLoad()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
func numberOfRows(in tableView: NSTableView) -> Int {
return max(tokens.count,tokens2.count)
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
guard let vw = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else {
return nil
}
if tableColumn?.title == "Tokens" {
vw.textField?.stringValue = tokens[row]
}
else
{
if row < tokens2.count {
vw.textField?.stringValue = tokens2[row]
}
else {
vw.textField?.stringValue = ""
}
}
return vw
}
// The bit where I need help
func tableView(
_ tableView: NSTableView,
pasteboardWriterForRow row: Int)
-> NSPasteboardWriting?
{
return tokens[row] as NSString //Here I need to return tokens2[row] if a token from column 2 was dragged and dropped
}
}
我想不通的是哪一列得到点击以启动拖放
tableView.clickedColumn
总是-1没有其他功能,比如这个火
func tableView(_ tableView: NSTableView, updateDraggingItemsForDrag draggingInfo: NSDraggingInfo)
更新:我可以在开始拖动操作后立即触发此功能:
func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet)
我试图捕捉mouseDown
,但也没有任何运气。任何指针?