2012-01-04 62 views
6

我有一個自定義視圖,我需要以編程方式添加幾個子視圖。哪個是創建和添加這些子視圖的最佳位置? Apple docs說:在哪裏調用[self addSubView]?

如果您的視圖類管理一個或多個完整的子視圖,請執行以下操作:您的視圖的初始化序列中創建這些子視圖。

這對我有點不清楚。我是否應該在initWithFrameinitWithCoder或其他地方處理?

請注意,我不是在說這裏的控制器,這是一個需要初始化自己的視圖。

回答

9

initWithFrame是您調用以編程方式創建UIView的方法,而當從XIB實例化UIView時調用initWithCoder

所以這一切都取決於你將如何創建你的包含視圖。 的一種方式,以涵蓋所有情況:

- (id) initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])){ 
     [self setUpSubViews]; 
    } 
    return self; 
} 

- (id) initWithCoder:(NSCoder*)aDecoder 
{ 
    if ((self = [super initWithCoder:aDecoder])){ 
     [self setUpSubViews];//same setupv for both Methods 
    } 
    return self; 
} 

- (void) setUpSubViews 
{ 
    //here create your subviews hierarchy 
} 
+0

另一種方法是從單個NIB創建視圖(容器和子視圖)。 – Vinzzz 2012-01-04 09:56:38

+0

謝謝,那看起來不錯。 – georg 2012-01-04 11:19:46

0

如果您想一直顯示視圖,通常應該在父視圖控制器的viewdidload/viewwillappear中創建視圖和[self addSubView]。你也可以將它設置爲隱藏,如果你有。在其他一些場景中,例如您想要顯示按鈕點擊或其他操作的視圖,您應該相應地添加子視圖。

+0

請仔細閱讀!他在談論需要創建/添加自己的子視圖的視圖。這與視圖控制器完全無關! – 2012-01-04 09:53:59

0

通過積分,他們的意思是重要的或巨大的。 viewDidLoad工作得很好,但對於非常重要或非常重要的東西,初始化方法是最好的選擇。

3

執行以下操作:採取何種方法對您的視圖指定初始化方法。也就是說,它是每個其他初始化程序調用的最可配置的(即大多數參數)init ...方法。例如,最常見的可以是-initWithFrame:。然後執行此方法如下:

- (id) initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // add new views here, for example: 
     UIImageView *imageView = [[UIImageView alloc] initWithImage:anImage]; 
     [self addSubview:imageView]; 
     [imageView release]; 
    } 
    return self; 
} 
+0

非常感謝! – georg 2012-01-04 11:20:16

+0

沒問題,如果真的有幫助,可以請接受嗎? – 2012-01-04 11:20:52

+1

我接受了另一個答案,因爲它提供了更多的「參考」代碼。如果可以的話,我也會接受你的。 – georg 2012-01-04 11:22:41