【问题标题】:NSMenuItem with custom view does not update具有自定义视图的 NSMenuItem 不会更新
【发布时间】:2012-03-09 16:07:40
【问题描述】:

我有一个带有自定义视图的 NSMenuItem。但是,当我想更新菜单中的第一行时,它会添加 xib 文件中的内容,而不是我设置的内容。

我的代码: AppDelegate.m:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    _helper = [[Helper alloc] init];

    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [statusItem setMenu:self.statusMenu];
    [statusItem setTitle:@"GravAccount"];
    [statusItem setHighlightMode:YES];

    _gravatarLoader = [[GravatarLoader alloc] initWithTarget:self andHandle:@selector(setGravatarImage:)];

    // Get email address
    _email = [_helper getEmailAddress];

    if (_email != nil)
    {
        [_gravatarLoader loadEmail:_email withSize:50.0];
    }
}

- (void)setGravatarImage:(NSImage*)image
{
    NSLog(@"Image loaded!");

    GravatarMenuItem *menuItem = [[GravatarMenuItem alloc] initWithNibName:@"GravatarMenuItem" bundle:nil];
    [menuItem.label setTitle:_email];
    [menuItem.imageView setImage:image];

    NSLog(@"Email: %@", _email);

    NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
    [item setView:menuItem.view];

    [self.statusMenu removeItemAtIndex:0];
    [self.statusMenu insertItem:item atIndex:0];
}

GravatarMenuItem.h:

#import <Cocoa/Cocoa.h>

@interface GravatarMenuItem : NSViewController

@property (nonatomic, strong) IBOutlet NSImageView *imageView;
@property (nonatomic, strong) IBOutlet NSTextFieldCell *label;

@end

出口链接在文件所有者的 XIB 文件中。

这是结果: 日志:

2012-03-09 16:57:24.314 appName[51158:403] Image loaded!
2012-03-09 16:57:24.316 appName[51158:403] Email: Paul@******.se

结果:

【问题讨论】:

    标签: objective-c macos cocoa nsmenuitem nsviewcontroller


    【解决方案1】:

    当你这样做时:

    GravatarMenuItem *menuItem = [[GravatarMenuItem alloc] initWithNibName:@"GravatarMenuItem" bundle:nil];
    

    它只创建视图控制器。它实际上并没有从笔尖加载视图。当您访问属性时,它们很可能是nil,因为尚未加载视图(并且尚未建立连接)。

    如果您将代码更新为以下内容,则一切正常:

    GravatarMenuItem *menuItem = [[GravatarMenuItem alloc] initWithNibName:@"GravatarMenuItem" bundle:nil];
    [menuItem view]; // load the view from the nib
    [menuItem.label setTitle:_email];
    [menuItem.imageView setImage:image];
    

    【讨论】:

    • 非常感谢。这真的很简单,但我没有找到它。
    猜你喜欢
    • 2015-01-15
    • 2014-02-27
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2021-01-12
    • 2011-06-23
    • 2011-08-10
    • 2011-05-30
    相关资源
    最近更新 更多