awakeFromNib被调用两次,并且未设置viewcontroller内的出口

时间:2015-12-28 23:43:03

标签: objective-c xcode macos storyboard

我正在尝试为OSX构建菜单栏应用程序。 我有一个AppDelegate,一个Storyboard和一个ViewController。 故事板包含AppDelegate的应用程序场景。 AppDelegate设置整个视图层次结构。在AppDelegate中,我使用ContentViewController(My ViewController)定义了一个NSPopover。为了设置ContentViewController,我使用以下代码从故事板加载ViewController:

 NSStoryboard*board=[NSStoryboard storyboardWithName:@"Main" bundle:nil];
    _ruleView.contentViewController=[board instantiateControllerWithIdentifier:@"egm"];

当我使用调试器检查awakeFromNib方法时,ViewController中的出口没有设置为什么? 下一个问题是当单击NSStatusItem时它显示NSPopover并且NSPopover再次调用我的ViewController中的awakeFromNib然后我的应用程序崩溃。 这是AppDelegate的代码:

#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate()
{
    NSStatusItem*_statusItem;
    NSPopover*_ruleView;
}
-(void)statusItemButtonPressed:(id)sender;
-(void)openPopupWindow;
-(void)closePopupWindow;
@end
@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
}
-(id)init
{
    self=[super init];
    if(self)
    {
        _ruleView=[[NSPopover alloc] init];
        NSStoryboard*board=[NSStoryboard storyboardWithName:@"Main" bundle:nil];
        _ruleView.contentViewController=[board instantiateControllerWithIdentifier:@"egm"];
        _statusItem=[[NSStatusBar systemStatusBar] statusItemWithLength:24];
        _statusItem.button.title=@"EG";
        _statusItem.button.action=@selector(statusItemButtonPressed:);
    }
    return self;
}
-(void)statusItemButtonPressed:(id)sender
{
    if(!_ruleView.shown)
    {
        [self openPopupWindow];
    }
    else
    {
        [self closePopupWindow];
    }
}
-(void)openPopupWindow{
    [_ruleView showRelativeToRect:NSZeroRect ofView:_statusItem.button preferredEdge:NSMinYEdge];
}
-(void)closePopupWindow{
    [_ruleView close];
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
    // Insert code here to tear down your application
}

1 个答案:

答案 0 :(得分:0)

我发现在从nib取消归档视图层次结构时,可以多次调用awakeFromNib。更好的替代方法是viewDidLoad,它确保整个视图层次结构已加载并准备就绪。