IBOutlets 在 XIB 视图上为零
Posted
技术标签:
【中文标题】IBOutlets 在 XIB 视图上为零【英文标题】:IBOutlets are nil on a XIB view 【发布时间】:2014-11-12 20:11:39 【问题描述】:我有一个UIView
子类,它是对应的 XIB。我在 Interface Builder 中设计的UITableViewCell
中使用了这个 UIView。使单元格出列时,我有一个从单元格到自定义视图的正确引用,但自定义视图的 IBOutlets 是 nil
。
这是一个显示问题的示例项目
https://github.com/JanC/TestXIB
我做错了什么?
干杯, 一月
【问题讨论】:
【参考方案1】:我不认为它与 UITableViewCell 完全一样,将其定义为 IBOutlet 不会加载所有子视图,因此您必须使用 [NSBundle mainBundle] loadNibNamed:@"" owner:self] 从包中加载它;并将其分配给您的项目视图
【讨论】:
这就是我在TAItemTitleView
类中所做的 (see here),但它会创建一个无限循环。我做了和this文章中描述的一样
我只添加了一个普通视图,图像视图的 IBOutlet 也是 nil github.com/JanC/TestXIB/blob/master/TestXIB/Classes/Controllers/…
您必须从单元格内的捆绑包中加载,而不是从同一个类中加载,这就是它无限循环的原因!由于您每次从包中加载时都使用 initWithCoder ,因此它将再次调用相同的方法,从而导致无限循环!
我该怎么做?谁是要加载的笔尖的“所有者”?【参考方案2】:
现在它可以正确加载了。在 xib 中,我将文件所有者设置为 TAItemTitleView
,并将类设置为 UIView。然后我在 TAItemTitleView
本身中加载 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;
https://github.com/JanC/TestXIB/blob/master/TestXIB/Classes/Views/TAItemTitleView.m
【讨论】:
以上是关于IBOutlets 在 XIB 视图上为零的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 自定义单元格 IBOutlets 为零
UIViewController 的 nibName 在 iPad 上为零,但在 iPhone 上不为零