代码之家  ›  专栏  ›  技术社区  ›  Ben Collins

将nib作为子视图的自定义视图似乎未加载

  •  3
  • Ben Collins  · 技术社区  · 16 年前

    我创建了一个自定义视图,从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 作为文件所有者的类型并连接 contentView 在IB的插座,我放了一个 UIView 从接口库转到显示给用户的全尺寸视图,然后将其类名更改为 Pricingdataview公司 . 所有这些都会生成,但在运行时,不会在我的自定义视图应该位于的位置呈现任何内容。

    我设置了断点 PricingDataView.initWithFrame ,但它们没有命中,所以我知道缺少了一些会导致视图初始化的内容。我好奇的是,在从nibs加载其他视图的过程中,所有的初始化都发生在我身上,但这次没有。为什么?

    3 回复  |  直到 14 年前
        1
  •  10
  •   yabada    16 年前

    你确定你的其他视图没有使用 UIViewController ?以下是 documentation 对于 initWithFrame: UIView :

    如果使用界面生成器进行设计 你的接口,这个方法不是 当视图对象是 随后从nib文件加载。 nib文件中的对象是 重新组合然后初始化 使用他们的initwithcoder:method, 它修改了 视图以匹配存储在 NIB文件。详细信息 关于如何从nib加载视图 文件,请参见 Resource Programming Guide .

        2
  •  1
  •   CoolBeans Jake    14 年前

    当您在运行时在接口生成器中添加文件时,它调用 -(id)initWithCoder:(NSCoder *)aDecoder 而不是initWithFrame。

        3
  •  1
  •   antyrat Andy    14 年前

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

    以前 awakeFromNib 在循环中调用。作为你的 customView 以及 View 您正在添加via Nib 作为一个 subView 属于同一类类型。