我有一个使用自动引用计数的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甚至是管理多个窗口的好方法,还是有更好的设计模式?谢谢!
答案 0 :(得分:0)
答。由Ben Flynn友情提供:
我把
sessionWindowControllers = [[NSMutableArray alloc] initWithCapacity:1];
在applicationDidFinishLaunching中,但是由于首先调用了awakeFromNib,我们试图在它存在之前向数组添加一个session实例。
解决方案:在我们创建第一个窗口之前,将数组init放在awakeFromNib中。
- (void) awakeFromNib {
sessionWindowControllers = [[NSMutableArray alloc] initWithCapacity:1];
[self newSessionWindow:nil];
}