【问题标题】:IBOutlets are nil on a XIB viewIBOutlets 在 XIB 视图上为零
【发布时间】:2014-11-12 20:11:39
【问题描述】:

我有一个UIView 子类,它是对应的 XIB。我在 Interface Builder 中设计的UITableViewCell 中使用了这个 UIView。使单元格出列时,我有一个从单元格到自定义视图的正确引用,但自定义视图的 IBOutlets 是 nil

这是一个显示问题的示例项目

https://github.com/JanC/TestXIB

我做错了什么?

干杯, 一月

【问题讨论】:

    标签: objective-c xcode interface-builder xib


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 2011-04-29
      • 2020-04-04
      • 2014-11-14
      • 2016-10-30
      • 2022-01-13
      • 2011-03-15
      • 2015-04-07
      相关资源
      最近更新 更多