交换视图 - 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 之间进行委托
如何通过按 ESC 键关闭窗口(NSWindowController)?
通过 NSWindowController 从窗口中删除 RepresentedFilename