NSTextField controlTextDidEndEditing:在编辑时调用(在NSOutlineView内)

时间:2014-04-12 21:36:13

标签: cocoa uitextfield nstableview nstextfield nsoutlineview

在我的NSOutlineView中,我在NSTableCellView中有一个NSTextField。我正在侦听controlTextDidEndEditing:当用户完成编辑时发生通知。但是,在我的情况下,即使在用户处于打字过程中,或者在键入时甚至需要第二次暂停时,也会触发此通知。这看起来很奇怪。我在同一视图中测试了NSTextField,但在NSOutlineView之外,并没有这样做;它只调用controlTextDidEndEditing:如果用户按Tab键或Enter键(如预期的那样)。

我能做些什么来防止NSTextField发送controlTextDidEndEditing:除非按下Enter键或Tab键?

2 个答案:

答案 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
    }
}