2012-10-19 28 views
2

有谁知道最好的方法来防止退出键关闭NSPanel当它是关键窗口?我的面板是一个子窗口,我希望它更像一个窗口的半永久部分,更像一个抽屉,对于文本控件,我希望使用Escape键取消编辑。防止退出键关闭与关闭框的NSPanel

我最近在Cocoa文档中发现了更多关于windows和Escape键的内容。在cancelOperation:下的NSResponder类参考中,它表示“该窗口向第一响应者发送默认动作消息cancelOperation:,并且从那里消息沿着响应者链向上传播”。 NSPanel似乎是不同的,并且窗口关闭时没有第一响应者得到cancelOperation:呼叫或NSTextView代表得到他们的doCommandBySelector:呼叫。

我对& out of the responder链的了解是可耻的,因为我一直在做OS X的工作。我在想,我需要在我的NSPanel子类中使keyDown:的行为与普通窗口类似。我尝试覆盖NSPanel,并可以捕获keyDown:,将呼叫转接到NSWindowkeyDown:而不是super,但没有任何更改,Escape仍然关闭窗口,而没有向第一响应者发送消息。那是合理的尝试?

我又试图彻底重新实现我的面板子keyDown:,使其做到这一点:

[self.firstResponder cancelOperation:self] 

我认为这将让我的文本字段处理逃逸怎么通常希望,也许如果没有文本领域是第一响应者,那么这个电话就会死光。不过,我尝试了它,面板就像之前一样关闭。很明显,我并没有在正确的层面拦截事情。

有没有人知道在低级别按键事件和面板关闭之间运行的方法序列,或者我需要重写以拦截它,并确保cancelOperation:去我的第一响应者?

回答

0

在您的笔尖或代码中的某处,将您的NSTableView代理设置到您的控制器。

请注意,setDelegate:不同于setDatasource:!

在我的情况: @interface ValueEditor:NSObject的

+ (ValueEditorCmdType)cmdTypeForSelector:(SEL)command 
    { 
    ValueEditorCmdType cmdType = kCmdTypeNone; 
    if (command == @selector(insertLineBreak:) || command == @selector(insertNewline:) || command == @selector(insertNewlineIgnoringFieldEditor:) || command == @selector(insertParagraphSeparator:)) 
     cmdType = kCmdTypeAccept; 
    else if ( command == @selector(insertTab:) || command == @selector(selectNextKeyView:) || command == @selector(insertTabIgnoringFieldEditor:)) 
     cmdType = kCmdTypeNext; 
    else if (command == @selector(insertBacktab:) || command == @selector(selectPreviousKeyView:)) 
     cmdType = kCmdTypePrev; 
    else if (command == @selector(cancelOperation:)) 
     cmdType = kCmdTypeCancel; 
    return cmdType; 
    } 

    #pragma mark - NSControl delegate 
    - (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command 
    { 
    ValueEditorCmdType cmdType = [ValueEditor cmdTypeForSelector:command]; 
    if (cmdType == kCmdTypeCancel) 
    { 
     [control abortEditing]; 

     // when user hits 'ESC' key with a field editor active, cancel the field editor, 
     // but return YES here so that NSPanel doesn't close. 
     // Hitting 'ESC' a 2nd time will close the NSPanel. 
     return YES; 
    } 
    return NO; 
    }