加载自定义UIView的最佳方式是什么?
在我的iPhone应用程序中,我制作了一个自定义的UIView,用于在几个不同的视图控制器中显示一些信息。加载自定义UIView的最佳方式是什么?
我很熟悉在表中使用客户表格单元格,但我从来没有再做过自定义视图。
我的问题是加载此视图的最佳方式是什么?我试图简单地将视图放置在我希望它使用IB显示的视图控制器中,但这似乎不够。在我看来,如果你为视图设置Class Identity,它应该在创建视图控制器时加载该视图。或者,也许它并不是因为它不知道用什么笔尖(当然它在自己的笔尖)。
由于它不是视图控制器,我不能只使用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实际放置视图的位置上丢失了来自IB的所有信息。它创建于0,0,这不是我想要的地方。是的,我知道我可以设置一个新的框架,但是再次,必须有一个更简单的方法。有没有办法通过IB来完成这一切?或者至少用编程方式减少工作量?
我也是这样做的。我碰到了我想要继承UIView
并使用笔尖的问题。我不认为有更好的方法可以这样做,因为nib文件可以包含许多对象,您必须指定使用哪一个。但是,通过这种方式,您可以将IBOutlet
放入MyCustomView
中,并将其绑定到IB中,以便视图可以自行管理,例如覆盖layoutSubviews
。
试试这个:创建一个新的UIViewController子类(为了回答起见称为ParentViewController),那么每个需要显示此信息的控制器也将继承子类。此控制器应该而不是有一个与它关联的笔尖。
在ParentViewController中,为UIView创建一个IBOutlet,该UIView将持有对包含您的自定义笔尖的视图的引用。 (又称为customView,也是因为)
现在,在界面生成器中打开您的笔尖(用于常用的customView)并选择文件的所有者。现在在标识选项卡中,选择上面为该类创建的ParentViewController。现在来了这个诀窍。在Connections中,移除任何到“查看”(如果有的话)的连接,并创建一个从customView插座到定义您的customView的最高级UIView的连接。
现在,当您在ParentViewController的子类的代码中执行loadNibNamed时,它应该自动从您的笔尖加载UIView,并将其引用到插口供您使用。不需要循环。
您还可以为您的笔尖中的任何其他界面组件添加插座并执行相同的操作。
祝你好运!
IB在这里为我做了些什么?我必须从nib手动加载视图,然后手动将框架设置为正确的位置和大小,然后将其添加到父视图。我已经使用一个UIView对象连接到IB,而这个UIView对象是我进入设计器的,但是这真的很有必要吗? IB在这里为我做什么? – Mike 2010-10-08 18:10:40
IB为您做所有的子视图布局,包括那些属性设置和IBOutlet和IBAction绑定。你可以继续找到更简单的方法,我相信没有。无论如何,你的代码片段是好的,如果你使它成为一种方法,你将更容易加载自定义的UIView。 – tia 2010-10-08 18:21:24