好的,我有两个有NSTableViews的项目。一个列有一个日期列(在a中,我允许用户更改日期的实现是通过更改NSTableview的doubleAction来显示带有图形日期选择器的NSPopover,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
self.changeAction()
}
func changeAction() {
self.entriesTableView.target = self
self.entriesTableView.doubleAction = "displayPopUp:"
}
displayPopUp(sender: AnyObject) {
var row = self.entriesTableView.selectedRow
var rowView:NSTableRowView? = self.entriesTableView.rowViewAtRow(row, makeIfNecessary: true) as NSTableRowView?
var rect = rowView?.bounds
if (rowView != nil){
var popover = NSPopover()
var storyboard = NSStoryboard(name: "Main", bundle: nil)
if (storyboard != nil) {
var popoverVC: CalendarPopupViewController = storyboard!.instantiateControllerWithIdentifier("calendarView") as CalendarPopupViewController
popover.contentViewController = popoverVC
var selectedEntry:Entry = self.entriesArrayController.selectedObjects[0] as Entry
popover.showRelativeToRect(rect!, ofView: rowView!, preferredEdge: NSMaxXEdge)
popoverVC.entryVC = self
popoverVC.entriesAC = self.entriesArrayController
popoverVC.datePicker.bind("dateValue", toObject: selectedEntry, withKeyPath: "date", options: nil)
popover.behavior = NSPopoverBehavior.Transient
self.datePopover = popover
}
}
}
这非常有效,而且我喜欢这种情况,而不是强迫用户使用带步进器的文本日期选择器。
后一种解决方案,带步进器的文本日期选择器,就是我在其他应用程序中所拥有的。我想用上面的解决方案替换它,但是这里有一个问题:在第二个应用程序中,NSTableview有三列,一个用于日期,另外两个用于可编辑的文本字段。所以,我不确定如何设置它以便双击日期拉动弹出框,但点击其他列功能就像正常...我不想要日期弹出窗口显示用户双击"标题"例如,只有当他们双击日期时!
有什么想法吗?
答案 0 :(得分:1)
在双击操作方法中,检查表格视图的clickedColumn
以了解双击了哪一列。您可以通过索引到表视图的NSTableColumn
数组来查找相应的tableColumns
。然后,您可以检查表格列的identifier
。如果它不是你要弹出的弹出窗口,只需返回。
设置双击操作确实会产生禁用双击编辑的副作用。如果要恢复该功能,则需要在返回之前执行此操作。对于基于NSCell
的表格视图,您可以通过在表格视图上调用-editColumn:row:withEvent:select:
来执行此操作。
对于基于视图的表视图,它有点复杂。 -editColumn:row:withEvent:select:
仅尝试将单元格视图作为第一响应者。如果单元格视图像NSTextField
那样简单,则可行。但是,如果它是NSTableCellView
之类的复合视图,则它不会接受第一响应者。你需要以某种方式在单元格视图中选择一个合适的子视图,并使其成为第一个响应者(Objective-C代码):
NSView* targetView = /* ... somehow pick a view ... */;
if ([targetView acceptsFirstResponder])
[targetView.window makeFirstResponder:targetView];