2013-05-13 2 views
0

상태 표시 줄 아이콘을 클릭하면 나타나는 사용자 정의보기와 관련된 ARC 프로젝트가 있습니다. 프로그래밍에 익숙하지 않아 GitHub에서 this example project을 가져와 실행합니다. 응용 프로그램이 정상적으로 실행되지만 상태 바 항목에만 문제가 있습니다. 필자는 NSStatusItem을 설정했지만 setView를 호출하자마자 아이콘이 해제 된 것으로 보입니다. 메뉴 바에서 앱을 여는 빈 공간을 클릭하면 항목이 표시되므로 아이콘이 누락 된 것입니다. (이미지가 유효한 것으로 확인 됨). 내가 뭘 놓치고 있니?NSStatusItem 아이콘 해제

다음은 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 

그리고 여기에 참조 된 menulet 코드입니다 : 바로이 - setView: 전화로

// 
// 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 
+0

@Antwan은'setImage :'또는'setView :'를 수행 할 필요가 있다고 말했다. 둘 다하면'setImage :'는 무시됩니다. 'WOMMenulet' 클래스 란 무엇입니까? 이미지를 제공하는 방법을 보려면 문서를 확인해야합니다. 아마'self.menulet.image = stausImage'는 당신이 필요로하는 것입니다. –

답변

3

setImage가, F 또는 NSStatusItem의 기본보기에만 유효합니다 메뉴 모음에 표시 할 사용자 정의보기를 설정 중입니다. 메뉴 바에 이미지가 있기를 원하면이 사용자 정의보기가 이미지를 그려야합니다.

이 정보

여기에, 워드 프로세서에서 찾을 수 있습니다 NSStatusItem class reference

에주의 사항 :

토론 사용자 정의보기를 설정 NSStatusItem에 의해 정의 된 모든 다른 모양 및 동작 설정을 재정의합니다. 커스텀 뷰는 그 자체를 드로잉하고 마우스 클릭을 처리하고 액션 메시지를 보내는 것과 같은 자체 동작을 제공합니다.

-1

이보기는 당신이 함께 작동, 내가 다른 사람으로부터 배운 꽤되지 않았지만, GitHub의의의 repo에서 원래의 코드로 되돌아 갔다

@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 
+0

이것은 단지이 질문에 특정한 시동기 일뿐입니다. –

+0

유권자는 최소한 저에게 무엇을했는지 말해주십시오. –

-1

항목에 설정 무엇을 그릴 것입니다 작은 비틀기. 도움을 주신 분들께 감사 드리며, 저는 이제 V2를 위해 무엇을해야하는지 알고 있습니다.