3

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

/* 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为 File's Owner 的类型,并contentView在 IB 中连接了插座。我将接口库中的一个常规放置UIView到向用户显示的全尺寸视图上,然后将其类名更改为PricingDataView. 这一切都建立了,但在运行时,我的自定义视图应该是什么都没有呈现。

我在 中放置了断点PricingDataView.initWithFrame,但它们没有命中,所以我知道我遗漏了一些会导致视图被初始化的东西。我很好奇的是,在从笔尖加载我的其他视图的过程中,所有的初始化都发生在我身上,但不是这个。为什么?

4

3 回答 3

10

您确定您的其他视图没有使用 aUIViewController吗?这是from文档中的引用:initWithFrame:UIView

如果您使用 Interface Builder 来设计您的界面,则当您的视图对象随后从 nib 文件加载时,不会调用此方法。nib 文件中的对象被重构,然后使用它们的 initWithCoder: 方法进行初始化,该方法修改视图的属性以匹配存储在 nib 文件中的属性。有关如何从 nib 文件加载视图的详细信息,请参阅资源编程指南

于 2010-05-04T22:18:18.363 回答
1

当您在运行时在 Interface Builder 中添加文件时,它会调用 -(id)initWithCoder:(NSCoder *)aDecoder 而不是 initWithFrame。

于 2011-01-04T12:37:39.560 回答
1

只需撤消PricingDataView您添加到的视图的类名 () UIView。在这种情况下,initWithFrame将调用 : 方法。

以前awakeFromNib在循环中调用。由于您customViewView您添加的 via Nibas asubView属于同一类类型。

于 2012-04-05T06:34:20.167 回答