使用来自 XIB 的自定义 NSView/UIView 子类?

Posted

技术标签:

【中文标题】使用来自 XIB 的自定义 NSView/UIView 子类?【英文标题】:Using custom NSView/UIView subclass from XIB? 【发布时间】:2014-10-14 07:32:50 【问题描述】:

好的,这听起来可能很基本(尤其是对于编写了数万个 Objective-C 代码的人来说),但我一直试图避免这一切......或者只是调整现有的解决方案。结果?我从来没有学会如何做这样简单的事情。

所以,这是我的超简单方案:

我想创建一个自定义 NSView(假设是一个包含图像和文本的简单视图),我可以在 Interface Builder 中分配它(使用 NSView 元素并将其类设置为MYCustomView - 仅此而已 - 没有更复杂的)

我知道我可以编写一个 NSView 子类并让它以编程方式在 drawRect: 中绘制我的所有元素以及所有这些 - 但我绝对找不到任何意义。

我想要的是在 Interface Builder 中简单地绘制视图(在我们的示例中,使用“占位符”图像和文本字段),能够将其用作我们 NSView 的“基础”子类,并且还维护指向视图中两个元素的指针,以便我可以通过编程方式访问它们。

我知道这是可行的——我不是在问这个。我需要的是一个-简单的演练。有什么可以指点我的吗?

用...单行改写问题:

如何将drawRect: 中的编程方法(在 99.9% 的 NSView 子类中看到)替换为取自 XIB 的布局?


附言

(A) 相信我,这一定是我第 100 次阅读NSViewControllers 和所有这些,但没有使用它们,可能意味着我还没有找到使用它们的意义...

(B) 请不要用“你试过什么”的问题向我开枪。随着时间的推移,我尝试了很多东西,有时我以某种方式做到了。然而,我总是觉得我刚刚设法开始工作,这是一件糟糕的、一团糟的事情。不多也不少。我只想知道是否有关于上述简单场景的简单教程。

(C) 如果我得到一个实际的解释性答案,我保证我会自己重新发布。您简直无法相信有多少经验丰富的 Cocoa 开发人员在处理这个问题时遇到了严重的问题……

【问题讨论】:

@JoeBlow a) 因为,尽管我对 OSX 而不是 ios 感兴趣,但我认为在这种特殊情况下并没有什么不同,不是吗? (好吧,这是 UIViewNSView 的事情,但它作为一个概念真的有那么不同吗?)比没有人注意到它的可能性高 100 倍(而 iOS 社区要大得多......):-) 如果你想做自定义绘图,那么你子类drawRect 使用层,基本上在层内做同样的事情. drawRect 不是用于布局 - 它是用于绘制几何形状或任何无法使用 Cocoa 控件实现的东西。 @Droppy 好吧,问题是我不是在谈论任何自定义绘图。我只是想要一个可重用的特定视图布局。图像将始终处于相同的位置。文本字段也是如此。只是我想在不同的地方使用它们,并且仍然能够访问视图的内部元素(以编程方式设置它们,绑定它们等)。就是这样。 好的,这很酷;但您需要删除问题中对drawRect 的引用,以免引起混淆。 @Droppy 可能我使用它是因为 - 嗯嗯 - 我自己有点困惑? :) 【参考方案1】:

我也一直想要“自定义”故事板类!

可能不完全回答你的问题,但这正是我们现在在 iOS 中的做法:只使用容器视图。

完整的超长教程:https://***.com/a/23403979/294884

现在 iOS 中的一切都是容器视图。

我们所做的只是有一个场景,然后复制它:然后改变颜色或你描述的任何东西。

这是在此浏览器窗口后面打开的故事板中的文字示例!

注意小类/场景的东西,我们只是复制它。请注意,正如您所说,在示例中它是略微定制的。它们都是同一个类(它恰好被称为“BookBist”)“bist”==“bouncy list”btw

那么正如我所说的容器视图是秘密,因为,正是出于这个目的,这就是为什么苹果最终引入了“容器视图”。

(顺便说一句,关于那个长容器视图教程。搜索到! 可笑的是,当您在容器视图中拖动时,Apple 会为您提供“默认”VC;当然,您永远不会想要这样;在手头的示例中,我将连接到容器视图的小型 BookBist 场景放在需要它们的任何地方。)示例.. .

现在,我 10000% 明白你在问什么,并且一直想自己知道答案!

对于使用 HALF 的答案,正如我所说,“复制场景”以便在现代故事板中完美运行。我很欣赏这很糟糕,因为你想要的是一个预制件,就像在任何游戏引擎中一样,例如 Unity3D,对吧?我也是!

但请注意,您的答案的另一半肯定是“容器视图魔术”——“一切都是”现在 iOS 中的容器视图,事实上,Apple 终于将它们放入其中,以合理的方式完成您所做的事情描述。

【讨论】:

哇。这是一个很好的答案。非常感谢。给我一些时间去经历它! :-) 如果您认为这很长,请尝试我链接到的答案! :) 真正的“容器视图”是故事板中所有内容的新方式。这太棒了——解决了一些问题(如果不是全部) OSX 故事板 (10.10) 中是否提供容器视图?

以上是关于使用来自 XIB 的自定义 NSView/UIView 子类?的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 XIB 的自定义 NSView/UIView 子类?

来自 XIB 的自定义 UIView 加载具有巨大规模的子视图

在主视图控制器的自定义单元格中使用来自 UIButton 的 IBAction

用户定义的运行时属性导致来自 xib 的 EXC_BAD_ACCESS

使用自定义 uiview xib

来自 NSWindowController Cocoa 的自定义视图