当用户完成在NSTableView中编辑单元格时,如何收到通知?

时间:2008-10-11 15:20:36

标签: cocoa macos

我需要知道用户何时完成在NSTableView中编辑单元格。该表包含所有用户的日历(从CalCalendarStore获取),因此为了保存用户的更改,我需要通知CalCalendarStore更改。但是,在用户完成编辑后我找不到任何被调用的内容 - 我猜测表中的委托会有一个方法,但我只看到一个在编辑开始时被调用,而不是在编辑结束时调用。 / p>

7 个答案:

答案 0 :(得分:14)

通过使用NSTableView或使用NSNotificationCenter方法,您可以在不使用NSControl进行子类化的情况下获得相同的结果。请参阅此处的Apple文档:

http://developer.apple.com/library/mac/#qa/qa1551/_index.html

这只是几行代码,对我来说非常合适。


如果您可以成为delegate的{​​{1}},则只需要实施该方法

NSTableView

实际上,- (void)controlTextDidEndEditing:(NSNotification *)obj { ... } 是它包含的NSTableView元素的delegate,并将这些方法调用转发给它的NSControl(还有其他有用的方法)

否则,请使用delegate

NSNotificationCenter

答案 1 :(得分:2)

使用addObserver为内容数组中的每个项设置观察者:toObjectsAtIndexes:forKeyPath:options:context:

您还需要为数组本身设置一个观察者,以便您收到有关添加到数组或从数组中删除的对象的通知。

查看iSpend项目的示例。

答案 2 :(得分:2)

子类NSTableView并覆盖textDidEndEditing :(务必调用super的实现)。

这只能由文本字段NSTextFieldCell或NSComboBoxCell调用(但仅在通过键入值而不是通过从组合菜单中选择值来更改值时)。

答案 3 :(得分:1)

查看NSTableDataSource协议。您要查找的消息称为:tableView:setObjectValue:forTableColumn:row:

答案 4 :(得分:1)

这似乎不适用于我的情况。我将我的控制器类设置为表的DataSource,但从未调用过该方法。数据是我的表绑定到NSArrayController中的值 - 这可能是我的对象没有被调用的原因吗?

答案 5 :(得分:0)

将@ Milly的答案翻译成 Swift 3

// Setup editing completion notifications
NotificationCenter.default.addObserver(self, selector: #selector(editingDidEnd(_:)), name: NSNotification.Name.NSControlTextDidEndEditing, object: nil)

处理通知的功能:

func editingDidEnd(_ obj: Notification) {
    guard let newName = (obj.object as? NSTextField)?.stringValue else {
        return
    }

    // post editing logic goes here
}

答案 6 :(得分:-1)

子类NSArrayController并覆盖objectDidEndEditing :(务必调用super的实现)。

这通常只能由文本字段NSTextFieldCell或NSComboBoxCell调用(但仅在通过键入值而不是通过从组合菜单中选择值来更改值时)。可能会有一些其他单元格会调用它,但我不确定哪些单元格。如果您有自定义单元格,请考虑实施NSEditor和NSEditorRegistration非正式协议。