UICollectionView Ne Figurant Pas
Je suis en train de mettre en place UICollectionView
par programmation de mon point de vue contrôleur qui s'étend UIViewController
. Pour une raison quelconque, ma collection de vue ne s'affiche pas du tout. Ci-dessous est ce que j'ai.
Pourquoi n'est-il pas apparaître? Je suis connecter au délégué et de la source de données et l'ajout d'une sous-vue de self.view
. Ce qu'il manque dans mon code?
Dans mon .h
fichier:
@interface MainViewController : UIViewController
{
@private
UICollectionView *_collectionView;
NSMutableArray *_results; //data source array
}
@end
Dans mon .m
fichier:
@interface MainViewController () <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@property (nonatomic, retain) UICollectionView *collectionView;
@property (nonatomic, retain) NSMutableArray *results;
@end
@implementation MainViewController
@synthesize collectionView = _collectionView;
@synthesize results = _results;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
//some init stuff - nothing to do with collection view.
}
return self;
}
- (void)loadView
{
self.results = [NSMutableArray array];
UIImage *image1 = [UIImage imageNamed:@"img1.jpg"];
UIImage *image2 = [UIImage imageNamed:@"img2.jpg"];
[self.results addObject:image1];
[self.results addObject:image2];
self.collectionView.dataSource = self;
self.collectionView.delegate = self;
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) collectionViewLayout:flowLayout];
self.collectionView = collectionView;
[self.view addSubview:self.collectionView];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
[self.collectionView reloadData];
}
- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section
{
return [self.results count];
}
- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView
{
return 1;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]];
return cell;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
UIImage *image = [self.results objectAtIndex:indexPath.row];
return CGSizeMake(image.size.width, image.size.height);
}
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
return UIEdgeInsetsMake(50, 20, 50, 20);
}
OriginalL'auteur darksky | 2012-09-29
Vous devez vous connecter pour publier un commentaire.
J'ai eu des erreurs en essayant d'exécuter votre code, à moins que j'ai changé le loadView méthode viewDidLoad -- d'après les docs que vous n'êtes pas censé appeler directement loadView. Pour obtenir la source de données et de déléguer des méthodes pour exécuter, j'ai déplacé les lignes de réglage du délégué et de la source de données à l'auto-dessous où vous définissez l'auto.collectionView = collectionView
UICollectionViewController
et la modification de lainit
méthode à celle qui est conforme àUICollectionViewController
et cela a fonctionné. Je vais avoir des problèmes aveccellForIndexPath
- je vais poster un nouveau post pour ça.Je ne sais pas pourquoi il n'aurait pas travaillé pour vous -- je viens de faire une nouvelle application, le mettre dans votre code, et a fait les 2 changements que j'ai mentionné, et il a bien fonctionné.
C'est bizarre. Êtes-vous capable de afficher les éléments ainsi? Je vais avoir des problèmes avec mon
cellForItemInIndexPath
. C'est de me donner uncould not dequeue
erreur. N'utilisez-vous pas xib/storyboard à tous ainsi?Pas de. Les seules choses que j'ai fait était de créer une nouvelle application à partir du seul modèle de vue et de déposer votre code par défaut dans le ViewController.h et .m. J'ai changé toutes les mentions de MainViewController à ViewController, traîné dans les deux images, et a fait les 2 changements que j'ai mentionné dans ma réponse. J'ai eu 2 images dans le coin supérieur gauche de l'écran et pas de messages d'erreur.
J'ai fait de même et cela a fonctionné. Drôle. Êtes-vous en mesure de la faire défiler en haut et en bas? J'ai ajouté la même image plusieurs fois et je ne peux pas les voir défiler. Il n'y a pas de drapeau pour permettre/interdire le défilement pour UICollectionViews.
OriginalL'auteur rdelmar
Votre
numberOfSectionsInCollectionView:
retourne0
. Pour une vue de collection avec une section, vous devez retourner1
ou tout simplement ne pas mettre en œuvre cette méthode.Aussi je ne vois pas où vous alloc/init
self.collectionView
.UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) collectionViewLayout:flowLayout]; self.collectionView = collectionView;
àloadView
et maintenant tout ce que j'obtiens est un vide noir de l'écran. Quand j'ai changé le fond de la collectionView, l'écran change sa couleur, ainsi que je sais que l'affichage de la collection est en train d'apparaître. Il n'est pas d'invoquer une source de données ou le délégué des méthodes bien que les données ne sont jamais à tous.Essayez de déplacer le programme d'installation à partir
loadView
àviewDidLoad
. Je ne peux pas tester moi-même en ce moment, mais c'est l'endroit habituel pour la mise en place des éléments personnalisés de vue.OriginalL'auteur Martin R
J'ai fini de sous-classement UICollectionViewController au lieu de
UIViewController
et la modification de la méthode init:- (id)initWithCollectionViewLayout:(UICollectionViewLayout *)layout
et cela a fonctionné.
OriginalL'auteur darksky
Vous n'aviez qu'à lier votre CollectionView délégué, et de la source de données à ViewController dans le StoryBoard.entrez la description de l'image ici
OriginalL'auteur Pek Mario