如何将 nib 自定义视图绑定到 NSVIew 子类

Posted

技术标签:

【中文标题】如何将 nib 自定义视图绑定到 NSVIew 子类【英文标题】:How to bind nib custom view to a NSVIew subclass 【发布时间】:2011-11-01 14:51:52 【问题描述】:

我有一个简单的要求。 单击 + 按钮时,我正在尝试将自定义视图添加到 SplitView

我创建了一个 MyCustomView 类,它是 NSView 的子类

在应用程序 nib 文件中,我有一个自定义视图,其中包含按钮等。

现在如何每次分配一个新的 MyCustomView ?

有这样的例子吗?

我希望是这样的

MyCustomView *v1 = [[MyCustomView alloc] init];

..
..
[splitView addSubView:v1];
[splitView addSubView:v2];

...

请帮忙

【问题讨论】:

【参考方案1】:

根据您的描述,很难准确说出您在描述什么,但让我们看看我是否理解您的意思。您希望每次单击“+”时都将自定义视图程序集的“副本”添加到拆分视图中,对吗?

执行此操作的绝对最佳方法是将要复制的自定义视图程序集(“原型”)放在其自己的 xib 中。对于您要表示的每个对象,您将从 xib 实例化一个新副本并将其提供给某个所有者,然后将其添加到某个父视图(在您的情况下为拆分视图......对于无限数量的视图来说很奇怪,但我没有足够的细节来说明)。

所以。在现代 Cocoa 世界中,这样的视图组件应该有自己的视图控制器 (NSViewController)。这使您的事情变得更容易,因为 xib 的文件所有者将是您的 MyCustomViewController 的一个实例,其 -view 连接到 xib 中的主容器视图(您的自定义视图及其所有子视图)并且其 -representedObject 设置为任何模型您的自定义视图代表的对象。然后,您的应用程序将维护模型对象的所有视图控制器的列表(可能是数组或字典)。请参阅this SO question/answer 了解如何从 nibs/xibs 加载。

这基本上是NSCollectionView 的工作方式(尽管视图必须全部相同 - 可能不适合您)。在这种情况下,集合视图对应于您的拆分视图; NSCollectionViewItem 对应于你的 MyCustomViewController (实际上在 10.5 及以上版本 NSCollectionViewItem 是 NSViewController 的子类);您的自定义视图是集合视图项的主视图。对于集合中的每个模型对象,它实例化一个 NSCollectionViewItem 并从 xib 加载视图原型(理想情况下,但这是可选的),并使用它来设置项目的视图,然后设置项目的表示对象(模型对象) .

我希望这能澄清一点。为了充分了解具体细节,您需要阅读一些内容,但如果您仍然遇到困难,您可以尝试编辑您的问题以澄清或提出一个新的、更具体的问题。

【讨论】:

如果我创建一个新的 nib Mynib 并在其中创建一个自定义视图。现在我应该在 xib 中添加一个 ViewController 对象吗? 您是否阅读了我在回答中链接到的 SO 问题中链接的文档?文档和网络上的六个非常好的教程都涵盖了这一点。简而言之:xib 的 File's Owner 的类名应该设置为您的自定义视图控制器的名称。 您是否提到类似 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification MyViewController *viewController = [[NSViewController alloc] initWithNibName:@"testview" bundle:nil]; [NSBundle loadNibNamed:@"testview" owner:viewController]; NSView *newView = [viewController 视图]; 我是新可可,

以上是关于如何将 nib 自定义视图绑定到 NSVIew 子类的主要内容,如果未能解决你的问题,请参考以下文章

将 NSWindow 显示为 NSView 的子视图

Cocoa - 从 nib 加载视图并将其显示在 NSView 容器中,作为子视图

从 Nib 加载 NSView 的多个实例

带有 nib 子视图的自定义 UIVIew 无

如何在加载了 nib 文件的 UIView 中调整子视图的大小

自定义 UIView 子类添加 nib 子视图