iOS:从笔尖加载自定义UIView

时间:2011-12-10 15:41:36

标签: iphone ios uiview interface-builder nib

我想创建自己的包含多个可重用控件的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加载View,并将theViewtheLabel插入其中。这不是很难,不是吗?我不明白......

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

请按照以下步骤操作

  • 将文件所有者字段留空。
  • 单击CustomView的xib文件中的实际视图,并将其Custom Class设置为CustomView(自定义视图类的名称)
  • 在自定义视图的.h文件中添加IBOutlet。
  • 在自定义视图的.xib文件中,单击视图并进入Connection Inspector。在这里,您将在.h文件
  • 中定义所有IBOutlet
  • 将他们与各自的观点联系起来。

  • 在CustomView类的.m文件中,覆盖init方法,如下所示

    - (CustomView *)init {             CustomView result = nil;             NSArray elements = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class])owner:self options:nil];             for(id anObject in elements)             {                     if([anObject isKindOfClass:[self class]])                     {                             result = anObject;                             打破;                     }             }             返回结果;         }

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