Question

j'essaye de mettre en place UICollectionView par programmation à mon avis, un contrôleur qui s'étend UIViewController.Pour une raison quelconque, ma vue de collection ne s'affiche pas du tout.Ci-dessous, ce que j'ai.

Pourquoi n'apparaît-il pas ?Je le connecte au délégué et à la source de données et je l'ajoute en tant que sous-vue à self.view.Qu'est-ce qui manque dans mon code ?

Dans mon .h déposer:

@interface MainViewController : UIViewController
{
    @private
    UICollectionView *_collectionView;
    NSMutableArray *_results; // data source array
}
@end

Dans mon .m déposer:

@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);
}
Était-ce utile?

La solution

J'ai eu des erreurs en essayant d'exécuter votre code à moins que je n'aie changé la méthode loadView en viewDidLoad - selon la documentation, vous n'êtes pas censé appeler directement loadView.Pour que la source de données et les méthodes déléguées s'exécutent, j'ai déplacé les lignes définissant le délégué et la source de données sur self ci-dessous où vous définissez self.collectionView = collectionView

    self.collectionView = collectionView;
    self.collectionView.dataSource = self;
    self.collectionView.delegate = self;

Autres conseils

Ton numberOfSectionsInCollectionView: Retour 0.Pour une vue de collection avec une seule section, vous devez soit retourner 1 ou tout simplement ne pas mettre en œuvre cette méthode.

De plus, je ne vois pas où vous allouez/init self.collectionView.

J'ai fini par sous-classer UICollectionViewController au lieu de UIViewController et en changeant la méthode init en :

- (id)initWithCollectionViewLayout:(UICollectionViewLayout *)layout

et ça a marché.

Il vous suffisait de lier votre délégué CollectionView et dataSource à ViewController dans le StoryBoard.entrez la description de l'image ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top