尝试从界面生成器加载笔尖
Trying to load a nib from interface builder
我有一个基于 UIView
的 class,它有自己的 XIB。让我们称之为 class MyClass
。所以我有 MyClass.xib
、MyClass.h
和 MyClass.m
.
我在故事板上有一个 UIView 对象,我将该对象的 class 设置为 MyClass
。
我创建了一个新的 UIView
XIB,在 XIB 中,我将文件所有者的 class 更改为 MyClass
。我不知道我是否必须在 XIB 内部进行更多连接。
我想要的是:故事板加载 MyClass.m
并且加载 MyClass.xib
,因此我有这个初始化代码:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
NSString *className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
[self addSubview:self.view];
return self;
}
return nil;
}
问题是这段代码进入了无限循环。我猜 loadNibNamed
再次调用 initWithCoder:
并且应用程序崩溃了。
我该怎么做?为什么会出现循环,是否还有必须在 xib 内部建立的更多连接?
使用 self.subviews.count == 0
打破循环,像这样:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self && self.subviews.count == 0) {
NSString *className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
[self addSubview:self.view];
}
return self;
}
让我们像下面一样
例如在 awakeFromNib
方法上启动它
在MyClass.m
文件中
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
//set up hear
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if(self)
{
}
return self;
}
- (void)awakeFromNib
{
[super awakeFromNib];
//set up hear
NSString *className = NSStringFromClass([self class]);
UIView *view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
[self addSubview:view];
}
我已经尝试了所有答案,但这是经过多次试验后唯一有效的代码:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self.view == nil) {
NSBundle *mainBundle = [NSBundle mainBundle];
[mainBundle loadNibNamed:@"MonthDayPicker" owner:self options:nil];
[self addSubview:self.view];
return self;
}
return nil;
}
我有一个基于 UIView
的 class,它有自己的 XIB。让我们称之为 class MyClass
。所以我有 MyClass.xib
、MyClass.h
和 MyClass.m
.
我在故事板上有一个 UIView 对象,我将该对象的 class 设置为 MyClass
。
我创建了一个新的 UIView
XIB,在 XIB 中,我将文件所有者的 class 更改为 MyClass
。我不知道我是否必须在 XIB 内部进行更多连接。
我想要的是:故事板加载 MyClass.m
并且加载 MyClass.xib
,因此我有这个初始化代码:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
NSString *className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
[self addSubview:self.view];
return self;
}
return nil;
}
问题是这段代码进入了无限循环。我猜 loadNibNamed
再次调用 initWithCoder:
并且应用程序崩溃了。
我该怎么做?为什么会出现循环,是否还有必须在 xib 内部建立的更多连接?
使用 self.subviews.count == 0
打破循环,像这样:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self && self.subviews.count == 0) {
NSString *className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
[self addSubview:self.view];
}
return self;
}
让我们像下面一样
例如在 awakeFromNib
方法上启动它
在MyClass.m
文件中
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
//set up hear
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if(self)
{
}
return self;
}
- (void)awakeFromNib
{
[super awakeFromNib];
//set up hear
NSString *className = NSStringFromClass([self class]);
UIView *view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
[self addSubview:view];
}
我已经尝试了所有答案,但这是经过多次试验后唯一有效的代码:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self.view == nil) {
NSBundle *mainBundle = [NSBundle mainBundle];
[mainBundle loadNibNamed:@"MonthDayPicker" owner:self options:nil];
[self addSubview:self.view];
return self;
}
return nil;
}