向MainWindow添加视图或窗口

Mar*_*per 13 macos cocoa objective-c

我绊倒了一些我无法理解的基本概念.我希望,有人可以为我清理一些事情,因为我找不到资源,这可以解释这一点.或许,它是在明亮的开放,我只是没有看到它.

到目前为止理解:MainWindow持有菜单,因此或多或少是必不可少的.该info.plist持有笔尖,这是装上AppStart的.

到目前为止还不了解:我正在尝试单个窗口应用程序.我可以在appDelegate中做任何事情(到目前为止工作正常)我可以有一个额外的控制器,我可以UIElements从MainWindow 连接到(到目前为止工作虽然很好).但是:我真正想做的是,有一个MainWIndow,它只有菜单,以及随后加载和添加的单独的控制器和笔尖(可能甚至超过后面的两个).

我的问题:

  • 使用NSWindowControllerNSViewController?为什么?(我用NSViewController)

  • 什么,在哪里以及如何实例化(大概是在didFinishLaunchingappDelegate中?)

  • 如何将窗口或视图添加到唯一的主窗口而不是第二个独立的窗口(我还没有为多文档应用程序启动)

Thanx很多,任何想法赞赏!

小智 23

到目前为止还不了解:我正在尝试单个窗口应用程序.我可以在appDelegate中做任何事情(到目前为止工作正常)并且我可以有一个额外的控制器,我可以从MainWindow连接UIElements(到目前为止工作虽然很好).但是:我真正想做的是,有一个MainWIndow,它只有菜单,以及随后加载和添加的单独的控制器和笔尖(可能甚至超过后面的两个).

为了清楚起见,MainWindow是一个nib文件,所以我将它称为MainWindow.nib.它是应用程序的Info.plist文件中指定的标准nib文件名,作为应用程序启动时要加载的nib文件.

默认情况下,Xcode创建一个包含主菜单和主窗口的MainWindow.nib文件.您可以从MainWindow.nib文件中删除该窗口,并使用另一个nib文件来保存该窗口.让我们调用另一个nib文件MyWindow.nib.

使用NSWindowController或NSViewController?为什么?(我倾向于viewController)

由于你将有一个单独的nib文件来保存一个窗口,你将使用NSWindowController.创建一个子类NSWindowController,例如MyWindowController,它将负责控制存储在MyWindow.nib中的窗口.此子类将具有指向该窗口中的用户界面元素的出口,以及可能在MyWindow.nib中定义的其他对象.

执行此操作时,在MyWindow.nib中执行以下操作非常重要:

  • 将文件的所有者设置为类型MyWindowController;

  • window文件所有者的插座连接到窗口对象.

NSViewController 用于管理通常从nib文件加载的视图,它不适用于Windows.

您可以重复此窗口 - .nib文件NSWindowController中的窗口,管理该窗口的子类- 根据需要为多个窗口.

什么,在哪里以及如何实例化(大概是在appDelegate的didFinishLaunching中?)

由于您需要在应用程序中使用单个窗口,因此应用程序委托的一个选项是将引用(实例变量,声明的属性)保存到管理该窗口的单个窗口控制器.然后,在-applicationDidFinishLaunching:,实例化所述控制器.

例如:

// MyAppDelegate.h

@class MyWindowController;

@interface MyAppDelegate : NSObject <NSApplicationDelegate>
@property (retain) MyWindowController *myWindowController;
@end
Run Code Online (Sandbox Code Playgroud)

和:

// MyAppDelegate.m

#import "MyAppDelegate.h"
#import "MyWindowController.h"

@implementation MyAppDelegate

@synthesize myWindowController;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.myWindowController = [[[MyWindowController alloc]
        initWithWindowNibName:@"MyWindow"] autorelease];
    [self.myWindowController showWindow:self];
}

…
@end
Run Code Online (Sandbox Code Playgroud)

如果你想要更多的窗口,只需要声明实例变量/属性来保存它们相应的控制器并像上面那样实例化控制器.

如何将窗口或视图添加到唯一的主窗口而不是第二个独立的窗口(我还没有为多文档应用程序启动)

你确定你要添加一个窗口到主窗口?如果是这样,那就称为附加窗口.您可以使用上面的机制(将窗口放在它自己的nib文件中,有一个子类NSWindowController来管理它,让你的原始文件MyWindowController持有一个引用(实例变量,声明的属性)到附加的窗口控制器,并实例化它/加载附加的适当时窗口nib文件)然后用于-[NSWindow - addChildWindow:ordered:]将辅助窗口附加到主窗口.

例如,考虑在MyWindowController.m中MyWindowController有一个声明的属性secondaryWindowController:

- (void)someAction:(id)sender {
    // If the secondary window hasn't been loaded yet, load it and add its
    // window as a window attached to the main window
    if (self.secondaryWindowController == nil) {
        self.secondaryWindowController = [[[MySecondaryWindowController alloc]
            initWithWindowNibName:@"MySecondaryWindow"] autorelease];
        [[self window] addChildWindow:self.secondaryWindowController.window
                              ordered:NSWindowAbove];
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要将视图添加到主窗口,最简单的方法是直接在nib文件中执行此操作.

如果您需要/想要以编程方式执行此操作,则需要引用该视图,然后将其添加到主窗口的内容视图中,例如:

[self.window.contentView addSubView:someView];
Run Code Online (Sandbox Code Playgroud)

您可以以someView编程方式创建或从单独的nib文件加载它.在后一种情况下,过程与上面描述的过程非常相似,但不是使用子类,而是使用子NSWindowControllerNSViewController.

例如,在MyWindowController.m中:

- (void)anotherAction:(id)sender {
    // If the view hasn't been loaded yet, load it and add it
    // as a subview of the main window's content view
    if (self.someViewController == nil) {
        self.someViewController = [[[MyViewController alloc]
            initWithNibName:@"MyView" bundle:nil] autorelease];
        // You'll probably want to set the view's frame, e.g.
        // [self.someViewController.view setFrame:...];
        [self.window.contentView addSubview:self.someViewController.view];
    }
}
Run Code Online (Sandbox Code Playgroud)