NSStatusItem выпускает значок

У меня есть проект ARC с пользовательским представлением, которое появляется после нажатия значка в строке состояния. Я новичок в программировании, поэтому я взял этот пример проекта с GitHub, чтобы приступить к работе. Приложение работает нормально, единственная проблема связана с элементом строки состояния. Я настроил NSStatusItem, как и должен, но как только я вызываю setView, значок, похоже, освобождается. Я могу щелкнуть пустое место в строке меню, которое открывает приложение, чтобы элемент был там, просто значок отсутствует. (Изображение подтверждено как действительное). Что мне не хватает?

Вот код NSStatusItem:

//
//  WOMAppDelegate.m
//  PopoverMenulet
//
//  Created by Julián Romero on 10/26/11.
//  Copyright (c) 2011 Wuonm Web Services S.L. All rights reserved.
//

#import "WOMAppDelegate.h"
#import "WOMMenulet.h"
#import "WOMController.h"

@implementation WOMAppDelegate

@synthesize window = _window;
@synthesize menulet;
@synthesize statusItem;
@synthesize statusImage;
@synthesize controller;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    //SET UP NSSTATUSITEM
    statusImage = [NSImage imageNamed:@"basket"];
    self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [self.statusItem setImage:statusImage];
    //[self.statusItem setHighlightMode:YES];
    [self.statusItem setEnabled:YES];

    self.menulet = [[WOMMenulet alloc] init]; /* square item */
    self.controller = [[WOMController alloc] init];
    self.menulet.delegate = controller;
    [self.statusItem setView:menulet];
}
@end

И вот указанный код менюлета:

//
//  WOMMenulet.m
//  PopoverMenulet
//
//  Created by Julián Romero on 10/26/11.
//  Copyright (c) 2011 Wuonm Web Services S.L. All rights reserved.
//

#import "WOMMenulet.h"

static void *kActiveChangedKVO = &kActiveChangedKVO;

@implementation WOMMenulet

@synthesize delegate;

- (void)setDelegate:(id<WOMMenuletDelegate>)newDelegate
{
[(NSObject *)newDelegate addObserver:self forKeyPath:@"active" options:NSKeyValueObservingOptionNew context:kActiveChangedKVO];
delegate = newDelegate;
}

- (void)mouseDown:(NSEvent *)event {
[self.delegate menuletClicked];
}

#pragma mark - KVO

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == kActiveChangedKVO) {
    //NSLog(@"%@", change);
    [self setNeedsDisplay:YES];
   }
}

@end

person Max Steenbergen    schedule 13.05.2013    source источник
comment
Как сказал @Antwan, вам нужно выполнить setImage: ИЛИ setView:. Если вы делаете и то, и другое, то setImage: игнорируется. Что такое WOMMenulet класс? Возможно, вам следует проверить документацию для этого, чтобы увидеть, как он ожидает, что изображение будет предоставлено. Возможно, self.menulet.image = stausImage это то, что вам нужно.   -  person Abhi Beckert    schedule 13.05.2013


Ответы (3)


setImage действителен только для представления по умолчанию NSStatusItem, как только вы вызываете - setView:, вы устанавливаете собственное представление для отображения в строке меню. Этот настраиваемый вид должен рисовать изображение само по себе, если вы хотите иметь изображение в строке меню.

Эту информацию можно найти в документации, здесь: ссылка на класс NSStatusItem

Обрати внимание на:

Обсуждение Настройка пользовательского представления переопределяет все другие параметры внешнего вида и поведения, определенные NSStatusItem. Настраиваемое представление отвечает за отрисовку самого себя и обеспечивает собственное поведение, такое как обработка щелчков мыши и отправка сообщений о действиях.

person Antwan van Houdt    schedule 13.05.2013

этот вид будет просто рисовать то, что вы установили для элемента

@interface DDQuickMenuStatusItemView : NSView
@property(weak) NSStatusItem *item;
//...
@end


@implementation DDQuickMenuStatusItemView

//...

- (void)drawRect:(NSRect)dirtyRect {
    NSImage *image = nil;
    if(self.item) {
        [self.item drawStatusBarBackgroundInRect:self.bounds withHighlight:NO];
        image = self.item.image;
    }

    if(image) {
        NSRect r = self.bounds;
        r.size = [image size];
        r = [self.class centerRect:r inRect:self.bounds];
        r = [self centerScanRect:r];
        [image drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
    }
}

#pragma mark -

+ (CGRect)centerRect:(CGRect)rect inRect:(CGRect)inRect
{
    CGRect result = rect;
    result.origin.x = inRect.origin.x + (inRect.size.width - result.size.width)*0.5f;
    result.origin.y = inRect.origin.y + (inRect.size.height - result.size.height)*0.5f;
    return result;
}

@end
person Daij-Djan    schedule 13.05.2013
comment
это просто стартер, специфичный для этого вопроса - person Daij-Djan; 13.05.2013

Я вернулся к исходному коду из репозитория GitHub, который, хотя и не очень хорош, как я узнал от других, работает с небольшой поправкой. Спасибо за помощь, ребята, теперь я знаю, что делать для V2.

person Max Steenbergen    schedule 13.05.2013