2015-11-05 21 views
0

我遵循這裏概述的教程在我的視圖控制器中加載定製的xib。爲什麼定製xib需要UIView屬性

類的廈門國際銀行從UIView的繼承,但還需要一個屬性視圖:

@interface MYBannerView : UIView 
@property (nonatomic, weak) IBOutlet UIView *view; 
@end 

我覺得很奇怪,它需要這個,因爲它就像這似乎是多餘的視圖中的視圖。這有什麼特別的原因嗎?

編輯

我跟着這裏本教程中,概述如下:

http://www.maytro.com/2014/04/27/building-reusable-views-with-interface-builder-and-auto-layout.html

+0

理論上你不需要的屬性,可以使用自... – kikko088

+2

它爲什麼需要它?你在哪裏讀到的? –

+0

我添加了我用作教程的原始鏈接 – user1686342

回答

0

該教程的作者使用視圖出口從XIB加載視圖時MYBannerView被編程初始化在界面生成器創建

- (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; 
    } 
    return nil; 
} 

任何不會與程序上init被加載。 loadNibNamed從xib加載用戶界面。

如果你想覆蓋initWithFrame:加載從廈門國際銀行的UI元素,您的init方法看起來是這樣的:

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; // initialize your objects 

    if (self) { 
     [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; // load your view from IB 
    } 

    return self; // return the view with all of the IB UI loaded 
} 
+0

仍然不是100%清楚。據我所知,當XIB以編程方式加載時,initWithFrame被調用,而initWithCoder僅在IB中使用相關類設置UIView時被調用。我試圖得到的是:是否有可能創建一個XIB,用IB添加UI組件到文件所有者,然後使用initWithFrame以編程方式初始化。 – user1686342

+0

爲了初始化使用接口構建器創建的任何UIView對象,必須調用'loadNibNamed:'以便從xib加載視圖。我編輯了我的帖子,用'initWithFrame:' – JAL

+0

來顯示一個例子。感謝您的建議。所以爲了澄清,如果我通過IB在XIB上添加一些按鈕和標籤,然後以編程方式加載IB(這會調用initWithFrame),那麼這些標籤和按鈕將不會加載? – user1686342

0

不,你的UIView子類並不需要一個出口的觀點是功能性。實際上,使用self您可以訪問視圖本身。 教程:當作者加入view A(讓我們這樣稱呼)MYViewController's視圖,他設置view A類爲MYBannerView。正在運行的應用程序不會顯示任何內容,因爲MYBannerView xib未加載並且未從view A中替換內容。因此作者在initWithCoder中加載此xib,設置使用loadNibNamed:返回的值,並將從MYBannerView加載的視圖添加到view A。這個過程有點雜亂,但它的工作原理。

相關問題