2012-03-09 60 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文件鏈接。

這是結果: 日誌:

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

它只創建視圖控制器。它實際上並沒有從nib加載視圖。當您訪問這些屬性時,它們很可能是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

感謝:

如果您更新的代碼下面,一切都應該很好地工作。這很簡單,但我沒有找到它。 – 2012-03-15 08:18:01

相關問題