Cocoa多窗口控制器

时间:2013-06-09 01:20:38

标签: objective-c cocoa nswindowcontroller

我有一个使用自动引用计数的Cocoa应用程序,并且不使用核心数据(不是基于文档的),我希望能够创建我在nib文件中定义的窗口的多个实例。

我目前在我的AppDelegate中有这个:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application

    // for slight performance bump, we assume that users usually have 1 session open.
    sessionWindowControllers = [[NSMutableArray alloc] initWithCapacity:1];
}

- (void) awakeFromNib {
    //  on start, we create a new window
    [self newSessionWindow:nil];
}
- (IBAction)newSessionWindow:(id)sender {

    SessionWindowController *session = [[SessionWindowController alloc] initWithWindowNibName:@"SessionWindow"];

    //add it to the array of controllers
    [sessionWindowControllers addObject:session];
    [session showWindow:self];

}

SessionWindowController是NSWindowController的子类。 但是当我运行它时,我得到了运行时错误

  

LayoutManagement [30415]:kCGErrorIllegalArgument:   _CGSFindSharedWindow:WID 11845 Jun 8 18:18:05 system-process LayoutManagement [30415]:kCGErrorFailure:设置一个断点@   CGErrorBreakpoint()在记录错误时捕获错误。 6月8日   18:18:05系统进程LayoutManagement [30415]:   kCGErrorIllegalArgument:CGSOrderFrontConditional:无效窗口

使用NSMutableArray甚至是管理多个窗口的好方法,还是有更好的设计模式?谢谢!

1 个答案:

答案 0 :(得分:0)

答。由Ben Flynn友情提供:

我把

sessionWindowControllers = [[NSMutableArray alloc] initWithCapacity:1];
在applicationDidFinishLaunching中

,但是由于首先调用了awakeFromNib,我们试图在它存在之前向数组添加一个session实例。

解决方案:在我们创建第一个窗口之前,将数组init放在awakeFromNib中。

- (void) awakeFromNib {
    sessionWindowControllers = [[NSMutableArray alloc] initWithCapacity:1];
    [self newSessionWindow:nil];
}