带有nib作为子视图的自定义视图似乎没有加载

时间:2010-05-04 21:49:37

标签: iphone objective-c interface-builder views nib

我已经创建了一个自定义视图,可以从笔尖加载其内容,如下所示:

/* 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加载我的其他视图的过程中,所有的初始化都发生在我身上,但不是这个。为什么?

3 个答案:

答案 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已在循环中调用。由于customViewView通过Nib添加subView属于同一类类型。