2015-11-14 28 views
0

我創建了一個xib。 xib的文件所有者是一個名爲PackageTrackingListViewElement的自定義類的集合。 PackageTrackingListViewElement有一個名爲contentView的IBOutlet屬性,等等。界面構建器中的幾個視圖連接到名爲PackageTrackingListViewElement的自定義類的IBOutlet屬性。使用xib以編程方式設置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的所有者。我知道這當然是錯誤的,但我不能將未創建的對象設置爲它自己的所有者。我不明白該怎麼做。

+0

我應該如何設置xib的文件所有者以使該類的屬性可以在視圖控制器中從外部訪問? – stackOverFlew

回答

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並將所有插座連接到該視圖。

+1

謝謝你,雖然它有一歲多了! – JackyW

相關問題