Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
Objective c 如何在Cocoa应用程序中切换视图?_Objective C_Cocoa_Macos_Nsviewcontroller - Fatal编程技术网

Objective c 如何在Cocoa应用程序中切换视图?

Objective c 如何在Cocoa应用程序中切换视图?,objective-c,cocoa,macos,nsviewcontroller,Objective C,Cocoa,Macos,Nsviewcontroller,所以我开始学习如何使用可可。我想我已经差不多明白了,但我对创建和切换视图很感兴趣。我正在改写一个我刚刚为练习做的游戏。我想要的只是一个窗口(最好是不可调整大小的),我希望能够切换出游戏中不同屏幕的视图 首先,我有主菜单(开始游戏,高分,退出)。然后,我需要一个窗口为每个屏幕(游戏屏幕,高分屏幕) 让我困惑的是如何设计这个。我查了一下NSViewController,认为它可以管理视图,但实际上没有。它只通过实际加载来管理一个视图。我不明白为什么我需要使用NSViewController。难道我不

所以我开始学习如何使用可可。我想我已经差不多明白了,但我对创建和切换视图很感兴趣。我正在改写一个我刚刚为练习做的游戏。我想要的只是一个窗口(最好是不可调整大小的),我希望能够切换出游戏中不同屏幕的视图

首先,我有主菜单(开始游戏,高分,退出)。然后,我需要一个窗口为每个屏幕(游戏屏幕,高分屏幕)

让我困惑的是如何设计这个。我查了一下NSViewController,认为它可以管理视图,但实际上没有。它只通过实际加载来管理一个视图。我不明白为什么我需要使用NSViewController。难道我不能拥有一个包含多个子类NSView的window类并像那样加载它们吗?我不确定我是否理解ViewController的用途

我的窗口类真的需要子类NSWindowController吗?我试着以苹果的ViewController为例,它有一个WindowController类,它是NSWindowController的一个子类。我不明白将其子类化的目的是什么。NSWindowController似乎添加的所有内容都是
-initWithPath:(NSString*)newPath
,但我看不到其中的作用,因为我可以在启动时编辑plist文件以打开窗口。苹果的示例还有一个NSView变量和一个NSViewController变量。你不是只需要一个变量来存储当前视图吗


提前感谢各位,我真的很困惑这是如何工作的。

使用UIVew中定义的以下函数(这是您现有窗口的一部分)


您可以使用
NSWindowController
NSViewController
来管理窗口或视图,因为您只需要为新的“种类”窗口或视图创建
NSWindow
NSView
的子类。例如,如果您想使用一个圆形窗口,您可以将其子类
NSWindow
。如果您只想在窗口中包含控件,则可以创建子类
NSWindowController

这与
NSViewController
相同:通常
NSViewController的
视图属于一些基类,例如
NSView
(或者您自己的绘制自定义背景的
NSView
子类)。
NSViewController
管理该视图的子视图之间的交互,允许它作为一个单元在更大的应用程序中运行

可以这样想:视图绘制,它们将原始输入事件转化为更高级别的操作。控制器向视图提供信息,并处理操作


以这种方式编写东西可以极大地提高代码的模块化程度,使设计、编写和调试变得更容易。

听起来你好像在试图在一个窗口内交换内容视图?如果是这种情况,您可以使用
-[NSView replaceSubview:with:://code>和
-[NSWindow contentView]
作为接收器

假设您有一个名为
titleView
的标题页和一个名为
menuView
的菜单页,并且您希望在应用程序的主窗口内外交换它们。如果标题页可见,并且用户单击“主菜单”按钮或链接,则可以在按钮的委托方法中放置类似的内容:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView];
需要注意两件事:

  • 在本例中,旧视图
    titleView
    通过此调用释放。如果您希望它仍然可用,您必须在更换它之前保留它
  • 如果页面具有不同的维度,则父视图将不会调整大小。更改窗口的帧大小,从而更改
    contentView
    非常简单,但您可以在混合中添加一点核心动画,使其具有某种风格

  • 我希望这有帮助

    我是cocoa新手,但我认为您的应用程序并不真正需要NSViewController。NSViewController在MVC设计模式中扮演“控制器”的角色。因此,它在一个视图中“控制”所有动作——粘合逻辑

    例如,在具有多个控件(按钮、表格、复选框:、文本字段、日期选择器等)的视图中,这些控件之间可能存在需要绑定和更新的详细交互。例如,单击按钮将加载数据库获取,并进行错误处理和验证。该粘合逻辑进入NSViewController类

    在你的应用程序中,听起来每个视图都是一个简单的页面,几乎不需要视图级别的控制。因此,您可能需要一个NSWindowController,一个控制器来处理从一页到另一页转换的逻辑和事件


    处理填充单个窗口的多个视图的一种技术是使用NSTabView,并在IB中将选项卡样式设置为“无边框”。然后使用按钮操作选择所需的NSTabView项。在开发过程中,将tabview样式设置为“top tabs”,IB允许您对子视图进行制表。

    桌面(NSView)中可用的相同界面,因此我想知道的是为什么要使用NSViewController。我应该吗?我应该使用NSView和NSViewController变量创建NSWindowController的子类吗?我不知道什么是真正必要的,以使一个窗口切换视图。据我所知,我根本不需要NSViewController,但我不知道,因为苹果的示例使用了它,它应该让事情变得更简单。你可以在ViewController中执行视图替换决策。苹果文档:“应用程序通过使用视图控制器对象显示一组新的视图来更改该窗口的内容。”我想这更有意义。您认为我必须使用
    initWithNibName:bundle:
    来加载视图,还是可以将视图的“文件所有者”设置为ViewController?您需要同时执行这两项操作。您可以使用
    -initWithNibName:bundle:
    实例化NSViewController子类。加载指定的nib f的
    [[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView];