如何仅更改 NSTableview 的单个列的双击操作
How can I change the double-click action for only a single column of NSTableview
好的,所以我有两个具有 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 有三列,一列用于日期,另外两列带有可编辑的文本字段。所以,我不确定如何设置它以便双击日期拉出弹出窗口,但单击其他列的功能就像正常一样......我不希望在用户时显示日期弹出窗口例如,双击 "title",只有当他们双击日期时!
有什么想法吗?
在您的双击操作方法中,检查 table 视图的 clickedColumn
以了解双击了哪一列。您可以通过索引到 table 视图的 tableColumns
数组来查找相应的 NSTableColumn
。然后,您可以查看 table 列的 identifier
。如果它不是您要为其显示弹出窗口的对象,只需 return.
设置双击操作确实有禁用双击编辑的副作用。如果您想恢复该功能,您需要在 returning 之前完成。对于基于 NSCell
的 table 视图,您可以通过在 table 视图上调用 -editColumn:row:withEvent:select:
来实现。
对于基于视图的 table 视图,它有点复杂。 -editColumn:row:withEvent:select:
只是试图让单元格视图成为第一响应者。如果单元格视图是像 NSTextField
这样简单的东西,这是可行的。但是,如果它是像 NSTableCellView
这样的复合视图,它不会接受第一响应者。您需要以某种方式在单元格视图中选择一个合适的子视图并将其设为第一响应者(Objective-C 代码):
NSView* targetView = /* ... somehow pick a view ... */;
if ([targetView acceptsFirstResponder])
[targetView.window makeFirstResponder:targetView];
好的,所以我有两个具有 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 有三列,一列用于日期,另外两列带有可编辑的文本字段。所以,我不确定如何设置它以便双击日期拉出弹出窗口,但单击其他列的功能就像正常一样......我不希望在用户时显示日期弹出窗口例如,双击 "title",只有当他们双击日期时!
有什么想法吗?
在您的双击操作方法中,检查 table 视图的 clickedColumn
以了解双击了哪一列。您可以通过索引到 table 视图的 tableColumns
数组来查找相应的 NSTableColumn
。然后,您可以查看 table 列的 identifier
。如果它不是您要为其显示弹出窗口的对象,只需 return.
设置双击操作确实有禁用双击编辑的副作用。如果您想恢复该功能,您需要在 returning 之前完成。对于基于 NSCell
的 table 视图,您可以通过在 table 视图上调用 -editColumn:row:withEvent:select:
来实现。
对于基于视图的 table 视图,它有点复杂。 -editColumn:row:withEvent:select:
只是试图让单元格视图成为第一响应者。如果单元格视图是像 NSTextField
这样简单的东西,这是可行的。但是,如果它是像 NSTableCellView
这样的复合视图,它不会接受第一响应者。您需要以某种方式在单元格视图中选择一个合适的子视图并将其设为第一响应者(Objective-C 代码):
NSView* targetView = /* ... somehow pick a view ... */;
if ([targetView acceptsFirstResponder])
[targetView.window makeFirstResponder:targetView];