0

我有一个使用自动引用计数并且不使用核心数据(不是基于文档)的 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:CGSOrderFrontConditionally:无效窗口

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

4

1 回答 1

0

答。本·弗林友情提供:

我把

sessionWindowControllers = [[NSMutableArray alloc] initWithCapacity:1];

在 applicationDidFinishLaunching 中,但由于首先调用了 awakeFromNib,我们试图在它存在之前将会话实例添加到数组中。

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

- (void) awakeFromNib {
    sessionWindowControllers = [[NSMutableArray alloc] initWithCapacity:1];
    [self newSessionWindow:nil];
}
于 2013-06-11T00:52:52.513 回答