我有一个简单的测试程序,它有一个2列的NSTableView (基于视图),两列的单元格都设置为NSTokenFieldCell。我在这个控制器中也有一个NSTokenField
我希望能够将令牌从表拖放到字段中。当我有1列时,这是正常工作的。现在我有两列,我需要知道要将哪个标记添加到字段
示例代码:
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 \f25 fire func tableView(_ tableView: NSTableView, updateDraggingItemsForDrag draggingInfo: NSDraggingInfo)
更新:我可以让这个函数在我开始拖动操作时立即触发:func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet)

我尝试过捕获mouseDown,但也没有任何成功的机会。有什么建议吗?
发布于 2021-06-25 17:42:40
一旦设置了NTTokenFieldCell,NSTokenFieldCell就没有将其属性设置为selectable,并且NSTokenField按预期工作。
https://stackoverflow.com/questions/68126760
复制相似问题