我的应用程序有两个状态栏图标。(StatusItem)
第一个总是打开的。第二个版本只有一个功能。
我的问题从下面的代码开始
-(void)deleteStatusBarItem
{
NSStatusBar *bar = [NSStatusBar systemStatusBar];
[bar removeStatusItem:statusBarItem];
}如果我不点击我的自定义状态项视图,它就不起作用。
这里的代码是我在菜单中通常触发的代码。
-(void)mouseDown:(NSEvent *)event {
_isPressed = YES;
[self setNeedsDisplay:YES];
[self performSelector:@selector(afterDelayCall) withObject:nil afterDelay:0];
}
-(void)afterDelayCall
{
[[_statusItem menu] setDelegate:(id)self];
[_statusItem popUpStatusItemMenu:[_statusItem menu]];
}下面是init的代码。以防万一。
-(void)addStatusBarItem
{
if (!statusBarItem)
{
NSStatusBar* bar = [NSStatusBar systemStatusBar];
statusBarItem = [bar statusItemWithLength:60];
trayMenu = [NSMenu new];
NSMenuItem* startRecordingItem = [[NSMenuItem alloc] initWithTitle:@"Start recording" action:@selector(testfunc) keyEquivalent:@""];
[startRecordingItem setTarget:self];
[trayMenu addItem:startRecordingItem];
NSMenuItem* closeRecordingItem = [[NSMenuItem alloc] initWithTitle:@"Close recorder" action:@selector(hideRecordWindow) keyEquivalent:@""];
[closeRecordingItem setTarget:self];
[trayMenu addItem:closeRecordingItem];
goToFullScreenItem = [[NSMenuItem alloc] initWithTitle:@"Fullscreen mode" action:@selector(fullScreenAction) keyEquivalent:@""];
[goToFullScreenItem setTarget:self];
[trayMenu addItem:goToFullScreenItem];
[statusBarItem setMenu:trayMenu];
VRICustomStatusBarView* contentView = [VRICustomStatusBarView new];
contentView.seconds = 0;
contentView.timeStringToDraw = @"00:00";
contentView.statusItem = statusBarItem;
[statusBarItem setView:contentView];
[contentView performSelectorOnMainThread:@selector(firstInitHack) withObject:nil waitUntilDone:1];
}
}我试图模拟鼠标点击或弹出菜单,但它没有帮助。
-(void)firstInitHack
{
CGKeyCode key_code = 125; // kVK_DownArrow = 125
CGEventRef event1, event2;
event1 = CGEventCreateKeyboardEvent(NULL, key_code, YES);
event2 = CGEventCreateKeyboardEvent(NULL, key_code, NO);
CGEventPost(kCGSessionEventTap, event1);
CGEventPost(kCGSessionEventTap, event2);
CFRelease(event1);
CFRelease(event2);
NSEvent* ev = [NSEvent eventWithCGEvent:event1];
[NSMenu popUpContextMenu:[_statusItem menu] withEvent:ev forView:self];
[NSTimer scheduledAnimationTimerWithTimeInterval:0.2f target:self selector:@selector(removeStatusItemAfterDelay) userInfo:nil repeats:NO];
}
-(void)removeStatusItemAfterDelay
{
[[_statusItem menu] cancelTracking];
}(有什么建议吗,是怎么回事?)
更新:
也许这个示例项目可以提供帮助?http://monosnap.com/file/RFhixVcSuKaUQQtxN7R0U0k6ij81ez
发布于 2014-04-16 23:03:37
这是个小牛队的bug。苹果的支持给了我一个变通的方法。
- (IBAction)removeStatusItem:(id)sender {
[statusBarItem setView:nil];
NSStatusBar *bar = [NSStatusBar systemStatusBar];
[bar removeStatusItem:statusBarItem];
statusBarItem = nil;
}这里有一些关于它的讨论:https://devforums.apple.com/message/959387#959387,这里是来自苹果支持的答案:http://monosnap.com/image/tjNKlyF8bF1Kdl0sfpVkZErdZUgURV
https://stackoverflow.com/questions/23066802
复制相似问题