当NSTokenField成为第一个响应程序时,我如何执行操作(显示popover)



我正在尝试将NSTokenField子类化,以在控件获得焦点后显示NSPopover或带有一些选项的菜单。不幸的是,经过几天的试探,我开始认为这是不可能的。

以下是我迄今为止所尝试的:

  • -textDidBeginEditing-controlTextDidBeginEditing是无用的,因为它们只有在用户键入第一个字母后才会被调用。我需要一些能集中注意力的东西
  • 重写-becomeFirstResponder-resignFirstResponder以显示和隐藏菜单或popover也没有用。令牌字段显然将第一响应者状态传递给私有视图(NSTokenFieldView),因此-resignFirsttResponder-becomeFirstReponder关闭菜单或立即弹出后立即被调用
  • 在关闭-resignFirstResponder中的菜单之前,我尝试观察-currentEditor的值。当控件处于编辑模式时,-currentEditor应为非零,但不幸的是,它的值仅在调用标记字段中的-resignFirstResponder之后设置,并且菜单再次立即关闭
  • 我尝试对NSTokenFieldCell进行子类化,并覆盖其-editWithFrame:-selectWithFrame:方法,但使用我的自定义NSTokenFieldCell的标记字段根本没有显示,也没有报告任何错误或异常

你知道怎么做吗?有人做过吗?

这很有效。我通过观察父窗口的firstResponder属性来完成此操作。如果令牌字段或其包含的任何NSResponders成为第一响应者,则显示popover。

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    [ self.window addObserver:self forKeyPath:@"firstResponder" options:NSKeyValueObservingOptionNew context:nil ] ;
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ( object == self.window && [ keyPath isEqualToString:@"firstResponder" ] )
    {
        NSResponder * responder = [ change valueForKey:NSKeyValueChangeNewKey ] ;
        while ( NULL != responder )
        {
            if ( responder == self.tokenField )
            {
                // show popover (if not showing)
                NSLog(@"Show popover!n") ;
                return ;
            }
            responder = responder.nextResponder ;
        }
        NSLog(@"Hide popover!n") ;
    }
    else
    {
        [ super observeValueForKeyPath:keyPath ofObject:object change:change context:context ] ;
    }
}
@end

相关内容

  • 没有找到相关文章

最新更新