首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从代码中移除statusbaritem?

如何从代码中移除statusbaritem?
EN

Stack Overflow用户
提问于 2014-04-15 01:50:34
回答 1查看 116关注 0票数 0

我的应用程序有两个状态栏图标。(StatusItem)

第一个总是打开的。第二个版本只有一个功能。

我的问题从下面的代码开始

代码语言:javascript
复制
-(void)deleteStatusBarItem
{
    NSStatusBar *bar = [NSStatusBar systemStatusBar];
    [bar removeStatusItem:statusBarItem];
}

如果我不点击我的自定义状态项视图,它就不起作用。

这里的代码是我在菜单中通常触发的代码。

代码语言:javascript
复制
-(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的代码。以防万一。

代码语言:javascript
复制
-(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];
    }
}

我试图模拟鼠标点击或弹出菜单,但它没有帮助。

代码语言:javascript
复制
-(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

EN

回答 1

Stack Overflow用户

发布于 2014-04-16 23:03:37

这是个小牛队的bug。苹果的支持给了我一个变通的方法。

代码语言:javascript
复制
- (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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23066802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档