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

时间:2015-11-14 06:08:27

标签: ios objective-c xcode xib key-value

我创建了一个xib。 xib的文件所有者是一个名为PackageTrackingListViewElement的自定义类的集合。 PackageTrackingListViewElement具有名为contentView的IBOutlet属性等。界面构建器中的多个视图连接到名为PackageTrackingListViewElement的自定义类的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的所有者时。我知道这当然是错的,但我不能将尚未创建的对象设置为自己的所有者。我不明白该怎么做。

1 个答案:

答案 0 :(得分:3)

唉,我明白了。非常感谢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

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