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