添加新的视图控制器并在cocoa应用程序中推送它

时间:2015-02-17 05:38:53

标签: objective-c macos nswindowcontroller nsviewcontroller

我是OS X应用程序的新手。在iOS中有以下方法:

1. self.window.rootViewController = self.viewController;
2. [self.window addSubview:self.viewController.view];

在窗口中添加视图控制器或

3. DefaultViewController *objDefault = [[DefaultViewController alloc] initWithNibName:@"DefaultViewController" bundle:nil];
   [self.navigationController pushViewController:objDefault animated:TRUE];
4. DefaultViewController *objDefault = [[DefaultViewController alloc] initWithNibName:@"DefaultViewController" bundle:nil];
   [self presentViewController: objDefault animated:TRUE completion:nil];

推送下一个视图控制器。

我的问题是在OS X中是否有任何类似上面的方法将新的视图控制器添加到窗口或推送下一个视图控制器..?

2 个答案:

答案 0 :(得分:0)

CocoaCocoa-touch有一些不同的方式来更改窗口上的视图。 要更改视图,您需要以编程方式删除旧的子视图并添加新的子视图。

- (void)addNewSubview:(NSView *)view // NSWindowController subclass implementation file
{
  [_subview removeFromSuperview];
  NSView *contentView = (NSView *)self.contentView;
  [contentView addSubview:view];
  _subview = view;
}

或简单[contentView replaceSubview:_subview with:view];

从OS X 10.10开始,就有机会使用iOS中的storyboards

<强> UPD

要从应用程序委托类唤醒窗口,请创建NSWindowController子类实例并显示窗口(它主要类似于iOS'故事前时代)。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  CustomWindowController *controller = [[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowController"];
  [controller showWindow:nil];
  [controller.window makeKeyAndOrderFront:nil];
}

答案 1 :(得分:0)

如果您使用storyboards和segues来显示新的NSViewController,那么您可能需要关闭旧的视图控制器。我是这样做的:

- (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender
{
    [self.view.window close];
}

每个视图控制器本身都会创建一个窗口,因此您需要在显示新窗口之前关闭旧窗口。