如何更改NSTableview的单个列的双击操作

时间:2015-02-01 22:37:59

标签: cocoa 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有三列,一个用于日期,另外两个用于可编辑的文本字段。所以,我不确定如何设置它以便双击日期拉动弹出框,但点击其他列功能就像正常...我不想要日期弹出窗口显示用户双击"标题"例如,只有当他们双击日期时!

有什么想法吗?

1 个答案:

答案 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];