[英]How to initialize UIView subclass that is load from xib? Problems with inheritance
[英]How to initialize a UIView subclass loaded from a xib?
关于如何对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并将其类标记为“ DarkSeparatorUIView”。 我希望在视图加载时会调用initWithCoder,但事实并非如此。 我想念什么吗?
编辑:我尝试了awakeFromNib,它也无法正常工作。
Edit2:这适用于新项目,但不适用于我当前的项目。 我不知道有什么不同?
- (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
我的问题是,当我创建DarkSeparatorUIView时,并未将其包含在所有构建目标中。 如果在创建文件时未执行此操作,则可以在“项目浏览器”中单击该文件,然后选择“文件浏览器”,然后选择希望该文件可用于的目标。
Apple已在UINibloading.h中声明的NSBundle
上创建了一个类别。 它将方法loadNibNamed:owner:options
到NSBundle
,这使得从捆绑中加载笔尖非常容易。
为此,我在UIView
上创建了一个类别。 它定义了一个方法:
+(instancetype)viewFromNib
在自定义UIView
子类的标题中包含此类别,以启用使用此衬板从笔尖加载它的方法:
MyView *view = [MyView viewFromNib];
我将类别归为要点 ,但加载笔尖的代码如下所示:
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.