在我的NSOutlineView中,我在NSTableCellView中有一个NSTextField。我正在侦听controlTextDidEndEditing:当用户完成编辑时发生通知。但是,在我的情况下,即使在用户处于打字过程中,或者在键入时甚至需要第二次暂停时,也会触发此通知。这看起来很奇怪。我在同一视图中测试了NSTextField,但在NSOutlineView之外,并没有这样做;它只调用controlTextDidEndEditing:如果用户按Tab键或Enter键(如预期的那样)。
我能做些什么来防止NSTextField发送controlTextDidEndEditing:除非按下Enter键或Tab键?
答案 0 :(得分:1)
为此找到了解决方案:
- (void)controlTextDidEndEditing:(NSNotification *) notification {
// to prevent NSOutlineView from calling controlTextDidEndEditing by itself
if ([notification.userInfo[@"NSTextMovement"] unsignedIntegerValue]) {
....
答案 1 :(得分:0)
这是一个古老的问题,但作为参考,我遇到了一个类似的问题,在编辑会话开始时调用了controlTextDidEndEditing:
。
我的解决方法是检查文本字段是否仍然具有焦点(即光标):
func controlTextDidEndEditing(_ obj: Notification) {
guard
let textField = obj.object as? NSTextField,
!textField.isFocused
else {
return
}
...
}
public extension NSTextField
{
public var isFocused:Bool {
if
window?.firstResponder is NSTextView,
let fieldEditor = window?.fieldEditor(false, for: nil),
let delegate = fieldEditor.delegate as? NSTextField,
self == delegate
{
return true
}
return false
}
}