我有下面显示的代码,该代码将NSPopover固定到我的NSTableView。我已经遍及Google和SO了,但是我找不到将弹出窗口固定到特定(选定)单元格的方法。任何帮助表示赞赏。
@@ objc func tableViewDoubleAction(sender:NSTableCellView){
let message = "Please Choose"
let controller = NSViewController()
controller.view = NSView(frame: CGRect(x: CGFloat(100), y: CGFloat(50), width: CGFloat(300), height: CGFloat(250)))
let popover = NSPopover()
popover.contentViewController = controller
popover.contentSize = controller.view.frame.size
popover.behavior = .transient
popover.animates = true
popover.show(relativeTo: sender.bounds, of: sender as NSView, preferredEdge: NSRectEdge.maxY)
先谢谢您,这是演示问题的图像:
摘自NSTableView.doubleAction
的文档:
clickedRow和clickedColumn属性可让您确定双击是在哪行和列中发生的,或者确定双击而不是在列标题中发生在行中。
@objc func tableViewDoubleAction(sender: NSTableView) {
let row = sender.clickedRow
摘自clickedRow
的文档:
用户单击以触发操作消息的行的索引。如果用户单击表视图中未被表行占用的区域,则返回–1。
if row >= 0 {
[NSTableView
具有方法rect(ofRow:)
:
返回包含指定索引处的行的矩形。
let rowRect = sender.rect(ofRow: row)
使用此矩形放置弹出框
popover.show(relativeTo: rowRect, of: sender, preferredEdge: NSRectEdge.maxY)
全部放在一起:
@objc func tableViewDoubleAction(sender: NSTableView) {
let row = sender.clickedRow
if row >= 0 {
// create the popover
let rowRect = sender.rect(ofRow: row)
popover.show(relativeTo: rowRect, of: sender, preferredEdge: NSRectEdge.maxY)
}
}