Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 从NSDocument类访问主窗口_Macos_Cocoa_Nswindow_Nsdocument - Fatal编程技术网

Macos 从NSDocument类访问主窗口

Macos 从NSDocument类访问主窗口,macos,cocoa,nswindow,nsdocument,Macos,Cocoa,Nswindow,Nsdocument,我有一个NSDocument类,我需要在其中访问主菜单窗口,该窗口在应用程序启动时打开。当我从应用程序在该窗口中操作时,所有操作似乎都正常工作,但当尝试从readFromFileWrapper:ofType:error:执行相同操作时,我访问的窗口似乎为零。为什么会发生这种情况 编辑:处理此问题的一些代码: 这是我的readFromFileWrapper:ofType:error:方法。这是我的openProject:type:方法: -(void)openProject:(NSString *

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

编辑:处理此问题的一些代码: 这是我的
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]];
}

NSLog(@“%@,[main window description])主窗口应为应用程序主窗口时,code>返回nil。我认为问题在于双击一个文件会重新分配所有文件,因此会失败。

处理这个问题的正常方法是向NSDocument子类添加一个IBOutlet,然后将它连接到.xib文件中的文档窗口

在您的.h中:

@interface MyDocument : NSDocument

@property (nonatomic, assign) IBOutlet NSWindow *docWindow;

@end
在您的.m中:

@implementation MyDocument : NSDocument

@synthesize docWindow;

@end

然后,最重要的部分是打开MyDocument.xib(或其他名称),将文件所有者(假设这是您的NSDocument子类,默认情况下)的连接拖动到主文档窗口,并将其连接到docWindow出口。

不完全清楚您在问什么。您提到
main window
main menu.xib
中的一个出口,但您没有指定定义出口的类

如果此窗口设计为具有单个主“项目”窗口,则应在应用程序委托中指定outlet属性

然后,您可以使用类似于
[(YourAppDelegate*)[NSApp delegate]mainWindow]的方法从其他类访问该文件

但是,如果您试图获取对当前文档窗口的引用,那么它就有点复杂了

默认情况下,
NSDocument
没有
窗口
出口的原因是,它被设计用于处理本身管理与文档相关的各种窗口的
NSWindowController
实例。这样,文档可以有多个窗口,显示相同数据的不同视图、与文档相关的其他选项板等。
NSWindowController
的每个实例都有自己的窗口nib文件和
window
outlet

默认情况下,
NSDocument
为您创建一个
NSWindowController
实例,前提是您没有专门为文档创建并分配
NSWindowController
实例。这是自动的,您甚至不需要知道窗口控制器是否存在

这意味着,如果您自己不使用
NSWindowController
实例管理文档窗口,您可以将窗口附加到
NSWindowController
上,该窗口由
NSDocument
自动创建,如下所示:

/* 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;
}

请发布您的代码,以便我们能够准确地了解您所做的不正确的操作。问题是我不知道要发布什么代码。我将尝试使用我刚刚发布的代码提供线索?您在哪里初始化/设置
main窗口
?另外,
MainWindow
可能应该被称为
MainWindow
。将变量名大写是不好的风格。类名(如NSString)通常大写。当您将变量名大写时,这会使代码难以阅读和理解,因为这会使它们看起来像类名。MainWindow是连接到MainMenu.xib中窗口的插座。关于命名,是的,我认为最好是这样称呼,但写得很匆忙,没有时间修改:)如果你真的这么做了,但它不起作用,我恐怕我不能说有什么问题,除非看到更多的代码和/或你的.xib文件。
/* 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;
}