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 上不为零

iOS 自定义视图文本标签为零

如果 XIB 中有更多***视图,为啥 outlet 会为零

使用 IBOutlets 将视图控制器初始化为自定义视图

在为自定义视图调用 NSBundle(使用 loadNibName)后访问 IBOutlets 的最佳方法