使用XCode 4设计自定义UIView

时间:2012-01-13 18:30:09

标签: xcode uiview

之前有人问过,但我找不到明确的答案。

我想设计一个自定义UIView类。我想在XIB文件中的XCode 4中进行布局。理想的情况是:

  • 我有MyView.h,MyView.m和MyView.xib文件。
  • 代码定义行为,XIB文件定义布局。
  • 代码可能有XIB文件的出口以引用布局元素。
  • 视图的加载器可以是不同的对象。

我希望能够通过以下方式加载视图:

MyView *v = [MyView myView];

我尝试了很多不同的方法来设置文件所有者并通过NSBundle加载XIB,但我不断获得关键值编码问题。

任何人都可以分享基本方法吗?

我有repo of my current code here。如您所见,它会生成键值编码错误。

2 个答案:

答案 0 :(得分:0)

哦,我好像已经弄清楚了。

键如下:

  • XIB文件UIView只需要是通用的UIView。无需将其设置为您的子类。
  • 文件所有者需要成为您的子类。
  • Outlets转到文件所有者。

在自定义UIView中,按如下方式加载NIB:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
        UIView *v = [[nib instantiateWithOwner:self options:nil] lastObject];            
        v.frame = self.frame;
        [self addSubview:v];
    }
    return self;
}

答案 1 :(得分:0)

你究竟如何实例化它?在我的“容器”类中,我有一个自定义视图作为属性的插座,但是当我尝试self.customView = [[CustomView alloc] init];

视图没有出现在屏幕上,即使我知道它已正确初始化,因为我可以看到我放入自定义视图的initWithFrame:方法中的NSLog()。

在我的主视图控制器中,在实例化新类之前,视图就像我在故事板中定义的那样:<CustomView: 0x6a83bb0; frame = (38 153; 244 153); autoresize = RM+BM; layer = <CALayer: 0x6a83c60>>

但是,在自定义视图的initWithFrame:中,框架为{{0, 0}, {0, 0}},视图为<UIView: 0x68ca160; frame = (0 0; 0 0); autoresize = W+H; layer = <CALayer: 0x68d1800>>

初始化完成后,自定义视图的主视图属性几乎为(null),这让我感到困惑。

我确定我在这里遗漏了一些非常简单的东西。您是否应该在故事板的主视图中定义自定义视图?

谢谢!