gpt4 book ai didi

objective-c - 当 NSTokenField 成为第一响应者时,如何执行操作(显示弹出窗口)?

转载 作者:行者123 更新时间:2023-12-03 17:04:50 25 4
gpt4 key购买 nike

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

这是我迄今为止尝试过的:

  • -textDidBeginEditing-controlTextDidBeginEditing 没有用,因为它们仅在用户键入第一个字母后才会被调用。我需要一些能在焦点上激发的东西。
  • 覆盖 -becomeFirstResponder-resignFirstResponder 来显示和隐藏菜单或弹出框也没有用。 tokenfield 显然将第一响应者状态传递给私有(private) View (NSTokenFieldView),因此 -resignFirsttResponder-becomeFirstReponder 关闭菜单或弹出窗口后立即被调用立即。
  • 在关闭 -resignFirstResponder 中的菜单之前,我尝试观察 -currentEditor 的值。当控件处于编辑模式时,-currentEditor 应该为非零,但不幸的是,只有在调用 tokenfield 中的 -resignFirstResponder 之后才设置它的值,并且菜单再次获取立即关闭。
  • 我尝试对 NSTokenFieldCell 进行子类化并覆盖其 -editWithFrame:-selectWithFrame: 方法,但使用我的自定义 NSTokenFieldCell 覆盖 tokenfield 根本不显示,也没有报告错误或异常。

知道如何做到这一点吗?有人做过吗?

最佳答案

这有效。我通过观察父窗口的firstResponder属性来做到这一点。如果 token 字段或其包含的任何NSResponder成为第一响应者,您将显示弹出窗口。

@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

关于objective-c - 当 NSTokenField 成为第一响应者时,如何执行操作(显示弹出窗口)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com