0

我目前在向 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 控件(textField)时,它都可以正常工作。但是,一旦我尝试添加我的自定义控件([control innerControlView],我就会在此处的视频剪辑中看到意外行为:http: //media.shinywhitebox.com/ryno-burger/ios-simulator-ios-模拟器-ipad-ios-a

上面的链接只是一个简短的 23 秒视频剪辑,以更好地展示我得到的“意外行为”。

如果有人能指出我做错了什么问题可能是什么,我将不胜感激。

谢谢

4

2 回答 2

3

正如您在s上的文档UICollectionViewCell中所读到的,您不应该将内容子视图添加到单元格本身,而是添加到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;
}
于 2012-10-11T09:31:10.283 回答
0

一个视图一次只能在一个超级视图中。如果它已经是容器视图的子视图,则不能将其添加为另一个视图(您的单元格)的子视图。

目前还不清楚为什么要将视图用​​作模型对象的一部分,但是在将其添加到单元格之前,您必须更改它或从当前父视图中删除内部视图。

于 2012-10-09T06:00:39.320 回答