关于如何创建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:这适用于一个新项目,但不适用于我当前的项目。我不知道有什么不同?
答案 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;
}
}