2012-03-09 2 views
0

У меня есть NSMenuItem с пользовательским представлением. Однако, когда я хочу обновить первую строку в меню, она добавляет содержимое, как в файле xib, а не так, как я его устанавливал.NSMenuItem с пользовательским представлением не обновляется

Мой код: 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 на владельца файла.

Это результат: Log:

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

Результат:
Result

ответ

5

Когда вы делаете:

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]; 
+0

Большое спасибо. Это действительно было просто, но я этого не нашел. –