加载自定义UIView的最佳方法是什么?

时间:2010-10-08 01:41:14

标签: iphone uiview uiviewcontroller interface-builder nib

在我的iPhone应用程序中,我制作了一个自定义UIView,我在几个不同的视图控制器中使用它来显示一些信息。

我熟悉将表格单元格用于表格,但我从未再次制作自定义视图。

我的问题是加载此视图的最佳方法是什么?我试过简单地将视图放在视图控制器中,我想让它出现在使用IB中,但这似乎不够。在我看来,如果为视图设置类标识,它应该在创建视图控制器时加载该视图是有意义的。或者它可能没有,因为它不知道从哪个笔尖获取它(当然是它在自己的笔尖中)。

由于它不是视图控制器,我不能只使用initWithNibName。我已经尝试过使用NSBundle loadNibNamed,就像我对表格单元格一样,但它似乎是一项非常大量的工作。代码如下所示:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:nil options:nil];
for (id currentObject in topLevelObjects) {
    if ([currentObject isKindOfClass:[MyCustomView class]]) {
        self.customView = currentObject;
        break;
    }
}
[self.view addSubview:self.customView];

必须有一种不涉及循环的简单方法。此外,以这种方式创建视图使我丢失了IB实际放置视图的所有信息。它是在0,0创建的,这不是我想要的。是的,我知道我可以设置一个新的框架,但同样,必须有一个更简单的方法。我有没有办法通过IB做到这一点?或者至少以编程方式减少工作量?

2 个答案:

答案 0 :(得分:1)

我也是这样做的。我遇到了我想要子类UIView并同时使用nib的问题。我不认为有更好的方法,因为nib文件可以包含许多对象,你必须指定使用哪一个。但是,这样做可以将IBOutlet放入MyCustomView并将其绑定到IB中,以便视图可以自行管理,例如覆盖layoutSubviews

答案 1 :(得分:1)

试试这个:创建一个新的UIViewController子类(为了回答而称为ParentViewController),你需要显示这些信息的每个控制器都将是子类。该控制器应与其关联的笔尖。

在ParentViewController中,为UIView创建一个IBOutlet,它将保存对包含自定义nib的视图的引用。 (再次调用customView,因为)

现在,在Interface Builder中打开你的nib(对于常用的customView),然后选择File的Owner。现在,在Identity选项卡中,选择上面为该类创建的ParentViewController。现在来了诀窍。在Connections中,删除与“view”的任何连接(如果有),并创建从customView出口到定义customView的nib的最顶层UIView的连接。

现在,当您在ParentViewController的子类的代码中执行loadNibNamed时,它应该自动从您的nib加载UIView并在插座中添加对它的引用供您使用。不需要循环。

您还可以为笔尖中的任何其他界面组件添加插座,并执行相同的操作。

祝你好运!