Uicollectionview non appare
-
11-12-2019 - |
Domanda
Sto cercando di configurare UICollectionView
Programmaticamente nel mio controller di visualizzazione che estende UIViewController
.Per qualche ragione, la mia vista di raccolta non viene visualizzata affatto.Di seguito è quello che ho.
Perché non appare?Lo sto collegando alla fonte del delegato e dati e lo aggiungo come sottoview a self.view
.Cosa manca nel mio codice?
nel mio file .h
:
.
@interface MainViewController : UIViewController
{
@private
UICollectionView *_collectionView;
NSMutableArray *_results; // data source array
}
@end
nel mio file .m
:
.@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);
}
Soluzione
Ho ottenuto errori che cercano di eseguire il tuo codice a meno che non venga modificato il metodo LoadView per ViewDidload - in base ai documenti che non dovresti chiamare direttamente loadview.Per ottenere l'origine dati e i metodi delegati da eseguire, ho spostato le linee impostando il delegato e la sorgente dati su se stesso in cui si imposta Self.CollectionView= CollectionView
self.collectionView = collectionView;
self.collectionView.dataSource = self;
self.collectionView.delegate = self;
. Altri suggerimenti
Il tuo numberOfSectionsInCollectionView:
restituisce 0
.Per una vista di raccolta con una sezione, è necessario restituire 1
o semplicemente non implementare questo metodo.
Inoltre non riesco a vedere dove si alloc / init self.collectionView
.
Ho finito la sottoclassificazione UicollectionViewController invece di UIViewController
e modificando il metodo Init per:
- (id)initWithCollectionViewLayout:(UICollectionViewLayout *)layout
e ha funzionato.
Dovevi collegare solo il delegato di CollectionView e DataSource per ViewController nello Storyboard. inserisci la descrizione dell'immaginequi