如何初始化从xib加载的UIView子类?

时间:2014-05-07 01:43:00

标签: ios objective-c uiview

关于如何创建UIView的子类,有无数的答案,但它们似乎都没有帮助我。

我有一个UIView子类

#import <UIKit/UIKit.h>

@interface DarkSeparatorUIView : UIView

@end

实施:

#import "DarkSeparatorUIView.h"

@implementation DarkSeparatorUIView

- (id)initWithFrame:(CGRect)frame {
  if ((self = [super initWithFrame:frame])) {
    // Do something
  }
  return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
  if ((self = [super initWithCoder:aDecoder])) {
    // Do something
  }
  return self;
}

@end

在一个单独的xib中,我正在创建一个UIView并将其类标记为&#34; DarkSeparatorUIView&#34;。我希望当视图加载时会调用initWithCoder,但事实并非如此。我错过了什么吗?

编辑:我已经尝试过awakeFromNib,但它也不起作用。

Edit2:这适用于一个新项目,但不适用于我当前的项目。我不知道有什么不同?

3 个答案:

答案 0 :(得分:0)

- (id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
   if (self) {
    // Initialization code
  self = [[[NSBundle mainBundle] loadNibNamed:@"DarkSeparatorUIView" owner:self options:nil] objectAtIndex:0];
}
  return self;
}

确保您的xib名为DarkSeparatorUIView.xib

答案 1 :(得分:0)

我的问题是,当我创建DarkSeparatorUIView时,我没有将它包含在我的所有构建目标中。如果在创建文件时未执行此操作,则可以单击Project Navigator中的文件,然后选择File Navigator并选择希望文件可用的目标。

答案 2 :(得分:0)

Apple已在UINibloading.h中声明的NSBundle上创建了一个类别。它将方法loadNibNamed:owner:options添加到NSBundle,这使得从包中加载nib非常容易。

为此,我在UIView创建了一个类别。它定义了一个方法:

+(instancetype)viewFromNib

在自定义UIView子类的标题中包含此类别,以便使用此一个内容从笔尖加载它:

MyView *view = [MyView viewFromNib];

我已将该类别放入a gist,但加载nib的代码如下:

NSString *className = NSStringFromClass([self class]);
NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:className owner:self options:nil];

id view = nil;
for (id object in bundle) {
    if ([object isKindOfClass:[self class]]) {
        view = object;
    }
}