NSView 高级概述?

Posted

技术标签:

【中文标题】NSView 高级概述?【英文标题】:NSView high-level overview? 【发布时间】:2010-10-16 05:00:14 【问题描述】:

我正在尝试创建自定义视图并将其加载到窗口中。

最后,我知道需要遵循几个步骤,反映我缺少的关键关系。我希望有人可以通过一系列步骤解释如何创建视图对象、视图控制器、关联的 .xib,然后将其加载到窗口中(在清除当前视图之后)。

我的意思是在哪里声明和初始化,需要导入什么,一切的真正细节。因为我正在翻阅我拥有的每一本书,而我那微不足道的大脑并不清楚。

谢谢!

【问题讨论】:

【参考方案1】:

如何创建视图对象、视图控制器、关联的 .xib,然后将其加载到窗口中……

这是几件事,其中一些相互冲突。

如果您在代码中创建视图,则不需要(也不应该)也在 nib 中创建它,反之亦然。

如果您创建一个视图控制器来加载 nib,您将在 nib 中创建视图,因此您绝对不应该在代码中创建相同的视图。

您不需要为大多数视图创建视图控制器。更常见的是让每个控制器都拥有一个窗口的全部。唯一需要视图控制器的情况是在单个窗口中管理复杂的视图层次结构(如果您将应用程序设为单窗口,则很可能)。

…(清除当前视图后)。

Cocoa 中没有“当前视图”。您可以有多个窗口,每个窗口都有一个您通常不会在运行时编辑的深层视图层次结构。在某种选项卡式 UI 之外将一个视图交换为另一个视图是非常不寻常的。

在代码中创建视图对象

向所需的视图类发送alloc 消息,并向返回的视图发送initWithFrame: 消息(除非该类的文档另有规定)。当然,您需要释放或自动释放此视图。

在 nib 中创建视图对象

给它自己的 nib(尤其是对于视图控制器)

在 IB(新建)或 Xcode(添加文件)中使用 view-nib 模板。如果您在 Xcode 中创建它,请不要忘记获取有关它的信息并使其可本地化。如果您在 IB 中创建它,您应该将它保存到您的 .lproj 文件夹之一中;那么它就已经可以本地化了。

从这些模板创建的 nib 将包含一个空的 NSView。您可以更改其类和/或添加子视图,如下所述。

在现有笔尖中制作

将“自定义视图”从库调色板拖到 nib 窗口中,然后在 ⌘6 检查器上设置视图的类。

您仅为 nib 中的***视图执行此操作。有关其子视图,请参见下文。

将视图放入窗口的视图层次结构

如果视图应该是窗口视图层次结构的根(窗口的内容视图)

设置窗口的内容视图。

在 IB 中,您无法更改窗口的内容视图。相反,你改变它的东西——它的类、子视图等。没有理由尝试用 IB 中的另一个视图替换窗口的内容视图。

如果视图应该是现有视图的子视图

在代码中执行此操作的方法是向超级视图发送addSubview: 消息。

如果两个视图在同一个 nib 中,则创建子视图并将其添加到同一行为中的父视图。将“自定义视图”从库中拖到超级视图中,而不是 nib 窗口中,然后在⌘6检查器上设置子视图的类。

(如果您要自定义标准 Apple 视图之一,而不是制作完全原始的自定义视图,请从库中拖动您基于的标准 Apple 视图,然后将其类更改为您自定义的子类。)

【讨论】:

再次感谢彼得。我想按照在窗口的根部有一个自定义视图的例子,然后在某些事件发生时向它添加子视图,所以如果我理解正确,这涉及将一个自定义视图拖到 NSWindow 中,然后有 2 个自定义视图作为他们自己的对象。但是人......我不知道设置任何这些视图的类。只是在IB?还是他们必须有相应的视图类文件?如果他们这样做了,这些类文件应该包含什么?没有?顺便说一句,我接受这个答案是因为,随着历史的发展,我相信我可以相信它! 在IB中不能随便编一个类名,然后类就存在了;您必须在程序的源代码中实现该类。 Xcode 有一个 NSView 子类的模板:当您为新的 Objective-C 类添加+创建文件时,它是超类选项之一。您可以将其留空,但它并不是真正自定义的,您最好不要费心制作自定义类——只需将该实例保留为您开始使用的任何标准 Apple 视图类的实例即可。当您制作自定义视图类时,您总是要自定义 something

以上是关于NSView 高级概述?的主要内容,如果未能解决你的问题,请参考以下文章

Html5之高级-12 Web Workers(概述 API)

高级程序设计语言概述

Html5之高级-8 HTML5 SVG(概述元素)

[高级]设计模式——设计模式概述

[高级]设计模式——设计模式概述

Html5之高级-14 Web Socket(概述API示例)