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
3 ответа
setImage является действительным только для представления по умолчанию NSStatusItem, как только вы вызываете - setView:
Вы настраиваете пользовательский вид для отображения в меню. Этот пользовательский вид должен рисовать изображение само по себе, если вы хотите иметь изображение в строке меню.
Эту информацию можно найти в документации здесь: ссылка на класс NSStatusItem
Обрати внимание на:
Обсуждение Настройка пользовательского представления переопределяет все остальные параметры внешнего вида и поведения, определенные NSStatusItem. Пользовательский вид отвечает за рисование самого себя и обеспечивает собственное поведение, такое как обработка щелчков мыши и отправка сообщений действий.
Этот вид просто нарисует то, что вы установили на элементе
@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
Я вернулся к исходному коду из репозитория GitHub, который, хотя и не очень хорош, как я узнал от других, работает с небольшим изменением. Спасибо за помощь, ребята, теперь я знаю, что делать для V2.