0

我在理解如何为 NSMenuItem 连接自定义 NSView 以支持动画和拖放时遇到了一些麻烦。我有以下 NSView 子类来处理大部分工作。当应用程序正确启动时,它会绘制我的图标,但是当我从另一个调用者调用 setIcon 函数时,我无法正确设置要更改的子视图。是否有一些我遗漏的设计元素?

托盘图标视图.m

#import "TrayIconView.h"

@implementation TrayIconView
@synthesize statusItem;
static NSImageView *_imageView;

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
      statusItem = nil;
      isMenuVisible = NO;
      _imageView = [[NSImageView alloc] initWithFrame:[self bounds]];
      [self addSubview:_imageView];
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
  // Draw status bar background, highlighted if menu is showing
  [statusItem drawStatusBarBackgroundInRect:[self bounds]
                              withHighlight:isMenuVisible];
}

- (void)mouseDown:(NSEvent *)event {
  [[self menu] setDelegate:self];
  [statusItem popUpStatusItemMenu:[self menu]];
  [self setNeedsDisplay:YES];
}

- (void)rightMouseDown:(NSEvent *)event {
  // Treat right-click just like left-click
  [self mouseDown:event];
}

- (void)menuWillOpen:(NSMenu *)menu {
  isMenuVisible = YES;
  [self setNeedsDisplay:YES];
}

- (void)menuDidClose:(NSMenu *)menu {
  isMenuVisible = NO;
  [menu setDelegate:nil];
  [self setNeedsDisplay:YES];
}

- (void)setIcon:(NSImage *)icon {
  [_imageView setImage:icon];
}

托盘图标视图.h

#import <Cocoa/Cocoa.h>

@interface TrayIconView : NSView

{
  BOOL isMenuVisible;
}

@property (retain, nonatomic) NSStatusItem *statusItem;

- (void)setIcon:(NSImage *)icon;

@end
4

1 回答 1

0

这个问题的解决方案实际上不在此处详述的视图中。接口的调用者意外地被双重实例化,从而使对先前创建的 NSView 的引用无效。在纠正了该问题后,该应用程序绘制并运行良好。

关于拖动,我只是实现了一个 NSView 的子类,它实现了 Cocoa 可拖动协议,并将其作为子视图添加到这个父类中。这允许拖动到当前建立的包含菜单栏图标的 NSRect 上。

于 2013-01-24T14:44:35.787 回答