使用 xib 以编程方式设置 IBOutlet 和文件所有者导致键值编码兼容错误

Using xib programatically setting IBOutlet and file owner results in key value coding-compliant error

我创建了一个 xib。 xib 的文件所有者是一组名为 PackageTrackingListViewElement 的自定义 class。 PackageTrackingListViewElement 有一个名为 contentView 的 IBOutlet 属性,等等。 Interface Builder 中的几个视图连接到名为 PackageTrackingListViewElement 的自定义 class 的 IBOutlet 属性。

我尝试从 xib 初始化一个对象。

PackageTrackingListViewElement *element2 = [[[NSBundle mainBundle] loadNibNamed:@"PackageTrackingListViewElementXib" owner:nil options:nil] objectAtIndex:0];

[element2.labelDate setText:@"12/14/15"];
[element2.labelLocation setText:@"Berkeley, California"];

在此之后,我将 element2 对象添加到 UIStackView。

我应该在 loadNibNamed 中设置什么文件所有者,这样我就不会得到 xib 所有者的错误我尝试访问的属性不符合键值对?

我的错误是 [<UIStackView 0x165ddc80> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key contentView.' 当我尝试将 stackView 设置为 xib 的所有者时。我知道这当然是错误的,但我不能将尚未创建的对象设置为它自己的所有者。我不知道该怎么办。

唉,想通了。非常感谢 Instantiating a UIView from a XIB file with itself as the file's owner?

谢谢nebs

PackageTrackingListViewElement.h

#import <UIKit/UIKit.h>

@interface PackageTrackingListViewElement : UIView

@property (nonatomic,strong) IBOutlet UILabel *labelLocation;

- (instancetype)initFromNib;

@end

PackageTrackingListViewElement.m

#import "PackageTrackingListViewElement.h"

@implementation PackageTrackingListViewElement : UIView

- (instancetype)initFromNib {
    return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:nil options:nil] firstObject];
}

@end

然后你可以简单地做:

PackageTrackingListViewElement *myView = [[PackageTrackingListViewElement alloc] initFromNib];


[myView.labelLocation setText:@"text"]; //access properties

通过使用上面 link 中的实例化过程,我让 xib 实例化工作了。我将 xib 的文件所有者设置为空(NSObject),而是将根视图(通过选择 xib 中的视图)设置为 PackageTrackingListViewElement 并将所有出口连接到该视图。