2012-10-09 51 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方法。我在解码器中发生崩溃,说我的观点是零 –