我已经创建了一个自定义视图,可以从笔尖加载其内容,如下所示:
/* PricingDataView.h */
#import <UIKit/UIKIt.h>
@interface PricingDataView : UIView {
UIView *contentView;
}
@property (nonatomic, retain) IBOutlet UIView *contentView;
@end
/* PricingDataView.m */
#import "PricingDataView.h"
@implementation PricingDataView
@synthesize contentView;
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
[[NSBundle mainBundle] loadNibNamed:@"PricingDataView" owner:self options:nil];
[contentView setFrame:frame];
[self addSubview:contentView];
}
return self;
}
/* ... */
在nib文件中,我将PricingDataView
设置为文件所有者的类型,并连接了IB中的contentView
出口。我将接口库中的常规UIView
放到显示给用户的全尺寸视图中,然后将其类名更改为PricingDataView
。这一切都是构建的,但在运行时,我的自定义视图应该是什么都没有呈现。
我在[{1}}中放置了断点,但它们没有命中,所以我知道我遗漏了一些会导致视图被初始化的东西。我很好奇的是,在从nib加载我的其他视图的过程中,所有的初始化都发生在我身上,但不是这个。为什么?
答案 0 :(得分:10)
您确定其他观点未使用UIViewController
吗?以下是来自initWithFrame:
的{{1}} documentation的引用:
如果使用Interface Builder进行设计 你的界面,这种方法不是 在查看对象时调用 随后从nib文件加载。 nib文件中的对象是 重构然后初始化 使用他们的initWithCoder:方法, 它修改了。的属性 视图以匹配存储的属性 nib文件。有关详细信息 关于如何从笔尖加载视图 文件,请参阅 Resource Programming Guide 。
答案 1 :(得分:1)
在运行时在Interface Builder中添加文件时,它会调用
-(id)initWithCoder:(NSCoder *)aDecoder
而不是initWithFrame。
答案 2 :(得分:1)
只需撤消添加到PricingDataView
的视图的类名(UIView
)。在这种情况下,将调用initWithFrame
:方法。
awakeFromNib
已在循环中调用。由于customView
和View
通过Nib
添加subView
属于同一类类型。