2012-10-09 82 views
0

時添加子視圖它時,但只能在特定情況下,我目前正面臨着UICollectionViewCell一個奇怪的問題意外行爲。添加子視圖UICollectionViewCell

下面是情形:

我有個「容器」視圖,其符合一個非常具體的協議(ADGControl)具有嵌套視圖,典型地爲UIKit中控制子類即MyCustomTextField:的UITextField定製控件。

的「容器」的觀點暴露了一個名爲「innerControlView」持有很強的參考自定義控件這正是我想要添加爲子視圖的單元格的內容視圖屬性。

下面是代碼:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    FormControlCollectionViewCell *cell = [self.formCollectionView dequeueReusableCellWithReuseIdentifier:@"formControlCell" forIndexPath:indexPath]; 
    NSArray *sectionContents = [_controlList objectAtIndex:[indexPath section]]; 

    // This works 
    //UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 315.0f, 30.0f)]; 
    //textField.borderStyle = UITextBorderStyleLine; 
    //[cell.controlView addSubview:textField]; 

    // This doesn't (see the behaviour in video clip) 
    id <ADGControl> control = [sectionContents objectAtIndex:[indexPath row]]; // The container view I'm referring to 
    [cell.contentView addSubview:(UIView *)[control innerControlView]]; // [control innerControlView] is the typical UIKit control subclass for custom controls. In this example it will be a UITextField 

    return cell; 
} 

正如你可以在上面的代碼註釋中看到,每當我嘗試添加只是一個UIKit的控件(文本框)直接,它工作得很好。但是,只要我嘗試添加我的自定義控件([control innerControlView]),就會看到視頻剪輯中出現的意外行爲:http://media.shinywhitebox.com/ryno-burger/ios-simulator-ios-simulator-ipad-ios-a

上面的鏈接只是短短23秒的視頻剪輯, 「意外的行爲」,我得到的。

如果有人能指出我在做什麼錯什麼樣的問題可能是我會很感激。

感謝

+2

你可能想移動的代碼(添加子視圖)的子類。因爲如果你這樣做,它會在每次調用方法時添加它。 –

+0

好涼,但我不知道在哪裏將其添加到我的UICollectionViewCell的子類,因爲我從dequeueReusableCellWithReuseIdentifier實例:。我試過 - (id)初始化,但它沒有被調用。我有一個很難用dequeueReusableCellWithReuseIdentifier,所以我不知道在哪裏可以加我的初始化代碼時理解UICollectionViewCell的生命週期。 – RynoB

+0

對不起,我的意思是說 - (id)initWithFrame。它從來沒有在調試器中擊中我的斷點。 – RynoB

回答

0

視圖只能在一個superview一次。如果它已經是你的容器視圖的子視圖,你不能只將它作爲子視圖添加另一種觀點(你的手機)。

這真不明白你爲什麼使用視圖模型對象的一部分,但你要麼必須改變或將其添加到細胞之前,將其從目前的上海華內部視圖。

+0

嗨,我試着添加只是容器視圖已經包含內部控制視圖而不是直接內部控制視圖,但仍然獲得相同的行爲,但稍有不同。現在似乎在一個單元格上覆蓋了文本字段。兩個視圖都有相同的框架,這是否重要?請參閱更新後的視頻片段:http://media.shinywhitebox.com/ryno-burger/ios-simulator-ios-simulator-ipad-ios-a2 – RynoB

+0

GuidoH有你在評論中提到過,我想。您每次都添加相同的視圖,即使是重新使用的單元格也是如此。 – jrturton

3

正如你可以在the documentation on UICollectionViewCells中看到的那樣,你不應該將內容子視圖添加到單元本身,而應該是contentView

而且,像在說我的評論之前,你不應該在數據源中添加子視圖,但在子類。你已經注意到,initWithFrame:不叫,用initWithCoder:代替:

-(id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     // Add your subviews here 
     // self.contentView for content 
     // self.backgroundView for the cell background 
     // self.selectedBackgroundView for the selected cell background 
    } 
    return self; 
} 
+0

我真的不喜歡在單元格本身添加子視圖,但如果我的uiview被數據源填充,會怎麼樣?我的意思是我使用數據源中的信息創建了一些。我創建了一個自定義單元類,並在解碼器方法中添加了視圖。我也填充我的視圖在它沒有出現的cellForIndexPath方法。我在解碼器中發生崩潰,說我的觀點是零 –