我正在尝试为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
}
答案 0 :(得分:0)
我发现在从nib取消归档视图层次结构时,可以多次调用awakeFromNib。更好的替代方法是viewDidLoad,它确保整个视图层次结构已加载并准备就绪。