交换视图 - NSWindowController 和 NSViewController(s)

Posted

技术标签:

【中文标题】交换视图 - NSWindowController 和 NSViewController(s)【英文标题】:Swapping views - NSWindowController and NSViewController(s) 【发布时间】:2011-07-07 19:16:52 【问题描述】:

我是 Mac OS 编程的新手。目前我正在尝试创建一个简单的测量应用程序,该应用程序将有一个窗口,顶部有工具栏,底部有适当的视图。单击工具栏中的按钮应导致其下方的视图切换 - 例如单击“连接”按钮将显示连接设置,“测量”将显示来自设备的当前数据。

问题是 - 我不知道如何处理交换视图,也许换句话说 - 我知道但不完全是...... 我在这里找到了类似的讨论:NSViewController and multiple subviews from a Nib 但没有答案如何创建 NSWindowController 以及如何将其分配给主窗口。因为我想有必要创建 NSWindowController 才能交换视图。如果我错了,请纠正我。

所以我正在创建新项目(此处称为 Sample),并且有 SampleAppDelegate.h 文件,如下所示:

@interface SampleAppDelegate : NSObject <NSApplicationDelegate> 
@private
    NSWindow *window;


@property (assign) IBOutlet NSWindow *window;

@end

有一个窗口 ivar,它包含从 MainMenu.xib 创建的唯一一个窗口(我认为)。

那么我应该如何从 SampleAppDelegate 为窗口创建 NSWindowController?

我应该只创建我的 WindowController 子类并在函数中 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification SampleAppDelegate 是这样的:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    MyWindowController *wc = [[MyWindowController alloc] initWithWindow:self.window];

    [wc showWindow:self];
    self.myWindowController = wc;
    [wc release];


我将非常感谢任何提示和帮助。

马辛

【问题讨论】:

【参考方案1】:

您不应该需要 NSWindowController 来进行视图交换,NSWindowController 仅在您需要多个***窗口时使用(我认为)。

您可以为您想要的每种视图类型子类化 NSViewController,将每个视图放入一个 nib,并在需要将视图放入窗口底部时调用 -(NSView *)view。您应该可以像往常一样将其添加到窗口中,或者使用 setContentView:view 将其放入 NSBox 中

对于您的两个视图,您将创建 MeasurmentsViewController 和 ConnectionViewController。然后,您将在 MeasurementsView.nib 和 ConnectionView.nib 中创建您的视图,并使用这些 nib 来初始化您的视图控制器。

然后在你的主窗口中,如果你要放一个 NSBox,如果你想把 MeasurementsView 放进去

NSView *measurementsView = [measurementsViewController view];
[boxAtBottomOfWindow setContentView:measurementsView];

并将 ConnectionView 放入其中

NSView *connectionView = [connectionViewController view];
[boxAtBottomOfWindow setContentView:connectionView];

【讨论】:

以上是关于交换视图 - NSWindowController 和 NSViewController(s)的主要内容,如果未能解决你的问题,请参考以下文章

osx:在 NSWindowController 和 NSViewController 之间进行委托

在Mac应用程序中添加自定义视图控制器作为根视图控制器?

如何通过按 ESC 键关闭窗口(NSWindowController)?

通过 NSWindowController 从窗口中删除 RepresentedFilename

NSWindowController showWindow: 闪烁窗口

NSManagedObjectContext 传递给 NSWindowController 变为 nil