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 に答える