iOS:从笔尖加载自定义 UIView

Posted

技术标签:

【中文标题】iOS:从笔尖加载自定义 UIView【英文标题】:iOS: Load a custom UIView from a nib 【发布时间】:2011-12-10 15:41:35 【问题描述】:

我想创建自己的 UI 库,其中包含几个可重用的控件。一个非常简单的可能是一个 LabeledView,它将包含一个 UIView(很可能是一个 UIImageView)和一个 UILabel。

----------------
| outer UIView |
| ------------ |
| |          | |
| |  UIView  | |
| |          | |
| ------------ |
| | UILabel  | |
| ------------ |
----------------

如何在 Interface Builder 中实现这一点,并在创建外部 UIView 时“注入”内部 UIView 和 UILabel?我将外部 UIView 作为文件的所有者,将内部 UIView 和 UILabel 与 IBOutlets 连接到我的 LabeledView 中的属性。我现在正在想象一个 init 函数,例如:

[[LabeledView alloc] initWithView:(UIView *)theView andLabel:(UILabel *)theLabel]

该方法应该使用其定义的布局从 nib 加载视图,并将 theViewtheLabel 插入其中。这不会太难,不是吗?没看懂……

【问题讨论】:

【参考方案1】:

如果您在 nib 中定义了视图等,那么您可以在运行时使用loadNibNamed: 此处描述的添加它们:http://developer.apple.com/library/ios/documentation/uikit/reference/NSBundle_UIKitAdditions/Introduction/Introduction.html

这将返回一个数组,第一个对象将是 nib 中的***对象 - 上面示例中的容器视图。

从 nib 加载内容时不要使用 alloc/init,因为 nib 本身包含对象的序列化版本,该版本已经实例化。

【讨论】:

是的,我明白了。但是在从该笔尖创建外部 UIView 之前,我有内部 UIView 和 UILabel ,我想“注入”它们,以便它们适应笔尖的布局和大小。 我认为内部视图和标签是笔尖的一部分。你说过它们是连接到外部视图的出口,外部视图是文件的所有者,所以它们必须是 nib 的一部分。我不明白你在问什么,你能给我更多的信息吗? 我不希望笔尖创建子视图和标签。我想使用之前创建的视图和标签。笔尖中的视图和标签应该只是充当占位符,我可以添加以前创建的视图和标签,以便它们从笔尖继承布局和属性。我得出的结论是,这很可能根本不可能,我需要自己实现布局...... 在这种情况下,为什么你不能只拥有一个带有占位符子视图和标签的笔尖,由插座定义,然后一旦你加载它,将插座值设置为你的预制视图和标签? 它应该做某事。我仍然不能 100% 确定您期望发生什么。您要“注入”的标签与笔尖中的标签有何不同?通常对于一个可重用的组件(考虑一个标准的表格视图单元格),您将创建对象然后通过代码设置文本值、字体等,您不会放入一个全新的视图并期望它适合。如果有的话,您可以将标签添加为子视图,但这会消除在笔尖中放置占位符的意义。【参考方案2】:

这可能会帮助您使用自己的IBOutlet 和方法创建独立的 UIView 子类。它们也将独立于“文件所有者”,这意味着您可以在代码中的任何位置使用它们。

按照这些步骤进行

将“文件的所有者”字段留空。 在您的 CustomView 的 xib 文件中单击实际视图并将其自定义类设置为 CustomView(您的自定义视图类的名称) 在自定义视图的 .h 文件中添加 IBOutlet。 在自定义视图的 .xib 文件中,单击视图并进入 Connection Inspector。在这里,您将在 .h 文件中定义所有 IBOutlets

将它们与各自的视图联系起来。

在 CustomView 类的 .m 文件中,重写 init 方法如下

-(CustomView *) 初始化 CustomView 结果 = nil; NSArray 元素 = [[NSBundle mainBundle] loadNibNamed: NSStringFromClass([self class]) owner:self options: nil]; for (id anObject in elements) if ([anObject isKindOfClass:[self class]]) 结果 = 一个对象; 休息; 返回结果;

现在,当您要加载 CustomView 时,请使用以下代码行 [[CustomView alloc] init];

【讨论】:

以上是关于iOS:从笔尖加载自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章

iOS:笔尖中的 TableView - 设置背景颜色

使用 IB / Xcode 4.5.1 和 iOS Simulator 6.0 自定义 UIView 操作方法

自定义 UIViewController 和自定义 UIView

隐藏 UIView 和更新约束

来自笔尖的自定义 UiTableViewCell 没有重用?

从 XIB 文件中为 ViewController 视图加载自定义 UIView