gpt4 book ai didi

objective-c - 使用 NSMenu 上的箭头控制 NSStatusItem-Objective-C/Cocoa 的 NSSlider

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

我想创建一个带有垂直 slider 的状态项,就像Apple提供的声音控制一样。我的问题是:如何让它对向上/向下箭头键使用react,就像声音菜单中的 slider 一样?

我尝试创建一个 NSSlider 子类,当按下按键时,该子类会增加/减少其值(见下文),但我需要使其成为第一响应者。为了使其成为第一响应者,我将主类设为此菜单的委托(delegate)并添加了此方法:

- (void)menuWillOpen: (NSMenu*)menu
{
if (menu == statusBarMenu) {
[THE_WINDOW_THAT_CONTAINS_THE_SLIDER makeFirstResponder: slider];
}

我应该调用哪个窗口?我应该以其他方式这样做吗?你会怎么做?

slider 子类:

#import <AppKit/AppKit.h>

@interface KeyRespondingSlider : NSSlider

@end

@implementation KeyRespondingSlider

- (BOOL)canBecomeKeyView
{
return YES;
}
- (BOOL)acceptsFirstResponder
{
return YES;
}

- (void)keyDown: (NSEvent*)theEvent
{
unsigned short keyCode = [theEvent keyCode];
if (keyCode == 126) { // up-arrow
[self setDoubleValue: [self doubleValue] + kChange];
}
else if (keyCode == 125) { // down-arrow
[self setDoubleValue: [self doubleValue] - kChange];
}
}

@end

我已经测试过它,当它是具有普通 NSWindow 的第一响应者时它可以工作。我只是无法使用状态栏项目中的菜单来做到这一点。

最佳答案

我已经弄清楚了。 Apple 使用名为 NSCarbonMenuWindow 的 NSWindow 子类来实现菜单。所以我收到了 menuWillOpen: 消息,我等待了一会儿菜单打开,我得到了最后一个窗口(刚刚创建的窗口 - 菜单窗口),并将 slider 设置为第一个响应者。现在一切正常了!

- (void)menuWillOpen: (NSMenu*)menu
{
if (menu == statusBarMenu) {
[NSThread detachNewThreadSelector: @selector(threadedMenuWillOpen) toTarget: self withObject: nil];
}
}

- (void)threadedMenuWillOpen
{
[NSThread sleepForTimeInterval: 0.1];

NSArray* windows = [NSApp windows];
NSWindow* menuWindow = [windows lastObject]; // The last window is the one I want because it has just been created

if ([[menuWindow className] isEqualToString: @"NSCarbonMenuWindow"]) {
[menuWindow makeFirstResponder: bSlider];
}
}

关于objective-c - 使用 NSMenu 上的箭头控制 NSStatusItem-Objective-C/Cocoa 的 NSSlider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7793549/

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