使用 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 并将所有出口连接到该视图。
我创建了一个 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 并将所有出口连接到该视图。