2014-05-22 51 views
2

比方說,我有一個XIB文件(MyView.xib)包含一個單一的根UIView的類是一些自定義的UIView子類(MyView)。實例化自己作爲文件所有者的XIB文件中的UIView?

我想從XIB文件中創建MyView的實例(代碼中),但我也希望文件的所有者是MyView本身的實例(以便我可以將IBOutlets從XIB鏈接到代碼)。

換句話說,MyView是XIB中根視圖的類,它也被設置爲文件的所有者類。

我想是這樣的MyView的裏面執行:

- (id)initFromNib { 
    self = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject]; 
    return self; 
} 

然後我意識到是沒有意義的,因爲在這一點上self是零,因此該文件的所有者設置爲無(沒有好)。

這開始感覺像雞蛋問題,因爲我需要文件的所有者是在創建之前即將創建的實例。

我又試圖這樣的事情:

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:CGRectMake(0.0, 0.0, 310, 166)]; 
    if (self) { 
     self = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject]; 
    } 
    return self; 
} 

顯然,這是一個臨時的黑客只是爲了看看它是否會工作,但沒有去。該視圖被加載並正確顯示,但是當我按下其中一個按鈕(其具有關聯的IBAction)時,該應用程序崩潰。

我失去了一些東西明顯?或者我的理解有某種缺陷?

一般問題是,我只想擁有一個包含該視圖的可視化表示的關聯XIB的自定義UIView子類,並且我還希望能夠在XIB和其相應的UIView子類之間關聯IBOutlets。

歡迎任何和所有建議。

回答

2

經過一番挖掘,我找到了解決方法。基本上,我沒有將IBOutlets和IBActions鏈接到文件的所有者,而是直接將它們鏈接到根視圖的類(它具有通過自定義子類公開的IB屬性)。

關鍵是不依賴文件的所有者,而是直接將出口和動作連接到自定義視圖。

這是我結束了去初始化:

- (instancetype)initFromNib { 
    return [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil] firstObject]; 
} 

這似乎是現在的工作很好。

UPDATE

我已經創建UIView的一個類別從XIBs(它假定XIB名稱相同的類名)初始化意見。

的UIView + Initialization.h

#import <UIKit/UIKit.h> 

@interface UIView (Initialization) 

- (instancetype)initFromNib; 

@end 

的UIView +初始化。米

#import "UIView+Initialization.h" 

@implementation UIView (Initialization) 

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

@end 

然後,您可以簡單地做:

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

假設你有一個MyView.xib文件有根視圖誰的類是MyView的。

+0

當我將IB中的Xib的文件所有者設置爲CustomClass時,這不起作用。相反,人們應該將視圖設置爲xib中的自定義類,我相信就是這樣。 – stackOverFlew

+0

請參閱http://stackoverflow.com/a/33711143/1392515 – stackOverFlew

+0

你知道在這種情況下MyView類是否能夠接收UI事件?那麼如果我的觀點有一個IBAction,它會被恰當地調用?從我的理解事件發送到文件的所有者。 –

相關問題