从NIB动态创建UIView的多个实例

时间:2011-11-26 17:43:28

标签: ios xcode

屏幕上有一个网格。它是UIView子类的一个实例。在网格中的单元格中,我想添加子视图的实例 - UIView的另一个自定义子类 - 当用户与应用程序交互时。子视图本身就是我想在XIB中设计的东西。其控件代表该特定单元的状态。它由几个UIControls组成(比如一个标签和一个按钮)。

我已经知道我可以使用

动态加载NIB
[[NSBundle mainBundle] loadNibNamed:@"MyNIB" owner:self options:nil];

我知道如果我将NIB中的File's Owner属性设置为视图控制器,它们将负责查看这些子视图将被添加到的视图。我使用它将一些外部NIB添加到主应用程序屏幕中的UIScrollview。

我想知道的是如何动态地执行此操作?我想说的是:

MySubviewCell * sv = [[NSBundle mainBundle] loadNibNamed:@"MyNIB" owner:self options:nil];
[sv setFoo:@"Foo"];
[sv setBar:123];
[sv setFrame:myrect];
[mainView addSubview:sv];

但当然loadNibNamed不会返回子视图实例,而是返回视图中所有控件的数组。

编辑 MySubviewCell NIB中的文件所有者将是一个问题:没有一个,并且不可能:我不知道我需要多少。我应该使用类似ArrayController的东西吗?

编辑2 请忽略之前的编辑;我把它留在了答案中,但这并不是我认为的问题。

我可以这样做吗?

由于

2 个答案:

答案 0 :(得分:4)

这在设计笔尖中的表格视图单元格时通常使用。你有两个选择:

  1. 返回数组的索引0处的对象将是笔尖中的“根”对象。
  2. 在MySubviewCell类型的视图控制器中创建一个插座。将文件在nib中的所有者类设置为视图控制器,并将插座链接到您感兴趣的笔尖中的元素。当您使用owner self加载笔尖时,将插入插座。然后,您可以对其进行配置,将其添加到阵列,并将插座设置为nil,以准备再次为下一个实例加载nib。

答案 1 :(得分:1)

尝试访问该数组中的第一个对象:

MySubviewCell * sv = (MySubviewCell*)[[[NSBundle mainBundle] loadNibNamed:@"MyNIB" 
                                                                    owner:self 
                                                                  options:nil]
                                       objectAtIndex:0];