我想创建自己的包含多个可重用控件的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,并将theView
和theLabel
插入其中。这不是很难,不是吗?我不明白......
答案 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子类和方法。它们也将独立于“文件所有者”,这意味着您可以在代码中的任何位置使用它们。
请按照以下步骤操作
Connection Inspector
。在这里,您将在.h文件将他们与各自的观点联系起来。
在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];