我是界面构建器的新手,我想要一个包含 UIView 的 3x3 网格的屏幕,每个网格都包含一个 UIImageView 和 4 个 UILabels。
我的逻辑可能有缺陷,但我试图实现这一目标的方式是:
- 使用 imageView 和 4 个标签在 IB 中创建 UIView Nib 文件 MyUIView.nib 和布局
- 创建一个名为 MyUIView.m 的 UIView 子类,其中包含 1 个 IBOutlet UIImageView 和 4 个 IBOutlet UILabels。将 MyUIView.nib 和 MyUIView.m 作为文件所有者链接并连接 socket 。
- 然后创建另一个 Nib MyGridViewController.nib,其中有 9 个 MyUIView,分布在 3x3 网格中。
- 创建一个 UIViewController,其中有 9 个 IBOutlet MyUIView 并通过 Interface Builder 连接它们。
是否可以从 InterfaceBuilder 中以图形方式将一个 Nib 加载到另一个 Nib 中,如果可以,我该怎么做?我是否将“标准”UIView 拖到 Canvas 上,然后将类更改为 MyUIView?
或者我是否需要在 MyGridViewController.m 中以编程方式完成这一切,例如:
for (int i=0; i<9; i++)
{
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"MyUIView" owner:self options:nil];
[myViewArray addObject:[ nibViews objectAtIndex: 1]];
}
我让它工作的唯一其他方法是使用一个 Nib 并放置 9 个 UIImageView 和 36 个 UILabels,但这显然是一种痛苦,当我想要更改某些内容时,因为我需要更新每个 3x3“单元格”。我认为在一个文件中更改它会更容易,并且所有 9 个文件都会更新。
最佳答案
您无法在 Interface Builder 中执行此操作。
我可能会做的是创建一个自定义 View ,例如 MyGridItem,它在唤醒时将 MyUIView.nib 作为 subview 加载,然后在 MyGridView.nib 中使用其中的 9 个 View 。
要小心awakeFromNib,因为如果 View 涉及到两个不同nib的加载,它可能会被调用两次(例如,如果加载MyGridView.nib时MyGridItem是所有者,那么当加载MyGridView.nib时,MyGridItem awakeFromNib将被调用一次作为加载 MyUIView.nib 的一部分加载,并在加载 MyGridView.nib 时加载一次。
此外,由于您加载 Nib 9 次,您可能需要使用一次缓存 Nib
NSNib* theNib = [[NSNib alloc] initWithNibNamed:@"MyGridItem" bundle:nil];
加载它:
if ( [theNib instantiateNibWithOwner:self topLevelObjects:NULL] ) {
在加载完所有九个 subview 后,您可能需要取消分配它。
关于iphone - 将 Nib 装入 Nib ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296903/