2013-03-03 5 views
63

Lorsque j'essaie de mettre UICollectionCell à UICollectionView dans Interface Builder je ne peux pas le mettre avec des raisons inconnues. La cellule va à la barre d'outils sans ajouter à UICollectionViewUICollectionView ajouter UICollectionCell

J'utilise:

  • iOS SDK 6.0
  • XCode 4.5.1
  • Je ne me Storyboard
+0

[Voici une simple procédure pas à pas] (http://stackoverflow.com/a/31735229/3681880) pour créer un objet UICollectionViewCell dans un objet UICollectionView. – Suragch

Répondre

130

Seulement UICollectionView à l'intérieur StoryBoard ont UICollectionViewCell l'intérieur. Si vous utilisez XIB, créez une nouvelle XIB avec CellName.xib, ajoutez CollectionViewCell à celle-ci, spécifiez le nom de la classe personnalisée UICollectionView. Après cela, utilisez registerNib.

Exemple de code: https://github.com/lequysang/TestCollectionViewWithXIB

+0

@NAQ bien, comment utilisez-vous votre classe? Assurez-vous d'avoir enregistré votre plume qui est liée à une classe, mais la classe initWithFrame n'est pas invoquée. donc si vous ne pouviez pas faire un style supplémentaire sur vos prises xib sur init. quel est l'avantage d'avoir la classe MyCell dans cet exemple? – topwik

+1

initWithFrame ne fonctionne dans aucune cellule Xib. Reliez IBOutlet à MyCell.h et appelez d'autres méthodes dans awakeFromNib. –

+6

Je suis étonné que Apple n'ait pas eu la gentillesse de le mentionner dans la documentation. -1 heure de ma vie. – expert

18

Vous ne pouvez pas mettre UICollectionViewCell directement dans le UiCollectionView si vous utilisez le fichier Xib. C'est possible seulement en storyboard. Ajoutez un UICollectionViewCell dans un fichier Xib distinct. Donnez le nom de votre classe. Alors inscrivez-vous ou l'autre classe ou avant que la vue xib de collection apparaît

[self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID]; 

En général cela se fait dans viewDidLoad.

C'est la mise en œuvre d'une coutume UICollectionViewCell avec l'aide Xib

@implementation CollectionViewCell 
@synthesize imageView = _imageView; 

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

    self.backgroundColor = [UIColor whiteColor]; 
    self.layer.shadowColor = [UIColor blackColor].CGColor; 
    self.layer.shadowRadius = 5.0f; 
    self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f); 
    self.layer.shadowOpacity = 0.5f; 

    // Selected background view 
    UIView *backgroundView = [[UIView alloc]initWithFrame:self.bounds]; 
    backgroundView.layer.borderColor = [[UIColor colorWithRed:0.529 green:0.808 blue:0.922 alpha:1]CGColor]; 
    backgroundView.layer.borderWidth = 10.0f; 
    self.selectedBackgroundView = backgroundView; 

    // set content view 
    CGRect frame = CGRectMake(self.bounds.origin.x+5, self.bounds.origin.y+5, self.bounds.size.width-10, self.bounds.size.height-10); 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; 
    self.imageView = imageView;   
    [imageView release]; 
    self.imageView.contentMode = UIViewContentModeScaleAspectFill ; 
    self.imageView.clipsToBounds = YES; 
    [self.contentView addSubview:self.imageView];  

} 
return self; 
} 
+0

que feriez-vous si vous utilisez un xib pour lequel vous assignez une classe? J'ai une classe UICollectionViewCell en tant que classe personnalisée de mon xib de cellule. je registerNib withNibName firCellWithResueIdentifier dans viewDidLoad (encore une fois xib est lié/connecté à une classe de cellules). puis-je combiner une mise en page xib avec une personnalisation supplémentaire effectuée dans le code en utilisant ma classe de cellules? il ne semble pas que le flux rectiligne invoque initWithFrame sur une classe si vous inscrivez simplement la plume.dois-je enregistrer à la fois la plume et la classe avec ma vue de collection? – topwik

+0

@towpse remplacez initWithFrame par awakeFromNib dans Cell.m. Ne retournez pas –

+0

@towpse Ce que dit NAQ est vrai. Enregistrez la plume. Ensuite, pour une personnalisation supplémentaire, utilisez initWithCoder ou awakeFromNib de votre cellule personnalisée (dans cell.m) –

0

D'accord. Il existe en fait une solution de contournement pour cela, si vous voulez vraiment avoir la cellule dans collectionView à l'intérieur du fichier xib à partir du constructeur de l'interface:

  1. Créer un storyboard.
  2. Créez UICollectionView et UICollectionViewCell à partir du générateur d'interface.
  3. Ajustez l'interface utilisateur avec des contraintes, etc., pour qu'elle ressemble exactement à ce que vous vouliez qu'elle soit.
  4. Créez un nouveau fichier xib.
  5. Copiez tout le contenu du storyboard dans le nouveau fichier xib.

Cela fonctionnera parfaitement.

  • Une chose à garder à l'esprit que l'étape 3 est très important, car après # 5 vous n'êtes pas censé faire glisser et déplacer la UICollectionView, si vous le faites, la cellule disparaît comme par magie! A part ça, ça marchera parfaitement.
Questions connexes