gpt4 book ai didi

macos - 从 NSDocument 类访问主窗口

转载 作者:行者123 更新时间:2023-12-03 17:28:37 25 4
gpt4 key购买 nike

我有一个 NSDocument 类,我需要在其中访问主菜单窗口,即应用程序启动时打开的主菜单窗口。当我从应用程序在该窗口中操作时,一切似乎都正常,但是当尝试从 readFromFileWrapper:ofType:error: 执行相同的操作时,我访问的窗口似乎为零。为什么会出现这种情况?

编辑:一些处理此问题的代码:

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError **)outError
{
if([[NSFileManager alloc] fileExistsAtPath:[NSString stringWithFormat:@"%@/Project.plist",[[self fileURL] path]]]) {
NSLog(@"%@", [[self fileURL] path]);

NSDictionary *project = [NSDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"%@/Project.plist",[[self fileURL] path]]];

if([[project objectForKey:@"type"] isEqualToString:@"vote"]) {

[self openProject:[[self fileURL] path] type:@"vote"];

return YES;

} else if([[project objectForKey:@"type"] isEqualToString:@"quiz"]) {

[self openProject:[[self fileURL] path] type:@"quiz"];

return YES;

} else {
return NO;
}
} else {
return NO;
}
}

这是我的 readFromFileWrapper:ofType:error: 方法。这是我的 openProject:type: 方法:

-(void)openProject:(NSString *)filepath type:(NSString *)type 
{
NSLog(@"Opening project @ %@",filepath);
NSLog(@"%@", [MainWindow description]);
[projectDesignerView setFrame:[[[[MainWindow contentView] subviews] objectAtIndex:0] frame]];
[projectDesignerToolbar setFrame:[MainWindow frame] display:FALSE];
[[MainWindow contentView] replaceSubview:[[[MainWindow contentView] subviews]objectAtIndex:0] with:projectDesignerView];
[[projectDesignerToolbar toolbar] setShowsBaselineSeparator:YES];
[MainWindow setToolbar:[projectDesignerToolbar toolbar]];
[MainWindow setRepresentedFilename:filepath];
[MainWindow setTitle:[NSString stringWithFormat:@"%@ - %@", [[filepath lastPathComponent] stringByDeletingPathExtension], [projectDesignerToolbar title]]];
NSString *path = [[NSBundle mainBundle] pathForResource:@"projectDesigner" ofType:@"html"];
NSURL *url = [NSURL fileURLWithPath:path];
[[projectDesignerWebview mainFrame] loadRequest:[NSURLRequest requestWithURL:url]];
}
MainWindow 应该是主应用程序窗口时,

NSLog(@"%@", [MainWindow description]); 返回 nil。我认为问题在于双击文件会重新分配所有文件,因此会失败。

最佳答案

目前还不完全清楚你在问什么。你提到MainWindowMainMenu.xib 的分店但您没有指定定义 socket 的类。

如果此窗口设计为具有单个主“项目”窗口,那么您应该在应用程序委托(delegate)中分配导出属性。

然后您可以使用类似 [(YourAppDelegate*)[NSApp delegate] mainWindow]; 的内容从其他类访问它.

但是,如果您尝试获取对当前文档窗口的引用,那么情况会稍微复杂一些。

原因是NSDocument没有 window默认情况下,outlet 旨在与 NSWindowController 的实例一起使用。它们本身管理与文档相关的各种窗口。这样,一个文档可以有多个窗口,显示相同数据的不同 View 、与文档相关的附加调色板等。 NSWindowController 的每个实例将有自己的窗口 nib 文件和 window导出。

默认情况下,NSDocument创建 NSWindowController 的单个实例如果您没有专门创建和分配 NSWindowController文档的实例。这是自动的,您甚至不需要知道窗口 Controller 的存在。

这意味着如果您不使用 NSWindowController 管理文档窗口自己实例,您可以将窗口附加到 NSWindowControllerNSDocument 自动创建像这样:

/* Only implement this in an NSDocument instance where the 
automatic window controller is being used.
If the document has multiple window controllers, you must
keep track of the main window controller yourself
and return its window
*/
- (NSWindow*)documentWindow
{
if([[self windowControllers] count] == 1)
{
return [[[self windowControllers] firstObject] window];
}
return nil;
}

关于macos - 从 NSDocument 类访问主窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8778809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com