Frage

Ich versuche es einzurichten UICollectionView programmatisch in meiner Ansicht Controller, der erweitert wird UIViewController.Aus irgendeinem Grund wird meine Sammlungsansicht überhaupt nicht angezeigt.Unten ist, was ich habe.

Warum erscheint es nicht?Ich verbinde es mit dem Delegaten und der Datenquelle und füge es als Unteransicht hinzu self.view.Was fehlt in meinem Code?

In meinem .h Datei:

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

In meinem .m Datei:

@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);
}
War es hilfreich?

Lösung

Ich habe beim Versuch, Ihren Code auszuführen, Fehler erhalten, es sei denn, ich habe die Methode „loadView“ in „viewDidLoad“ geändert – laut Dokumentation sollten Sie „loadView“ nicht direkt aufrufen.Damit die Datenquellen- und Delegatenmethoden ausgeführt werden können, habe ich die Zeilen, die den Delegaten und die Datenquelle auf „self“ festlegen, nach unten verschoben, wo Sie „self.collectionView =collectionView“ festlegen

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

Andere Tipps

Dein numberOfSectionsInCollectionView: kehrt zurück 0.Für eine Sammlungsansicht mit einem Abschnitt sollten Sie entweder zurückkehren 1 oder diese Methode einfach nicht implementieren.

Außerdem kann ich nicht sehen, wo Sie zuweisen/initiieren self.collectionView.

Am Ende habe ich stattdessen eine Unterklasse von UICollectionViewController erstellt UIViewController und Ändern der Init-Methode in:

- (id)initWithCollectionViewLayout:(UICollectionViewLayout *)layout

und es hat funktioniert.

Sie mussten lediglich Ihren CollectionView-Delegaten und dataSource an ViewController im StoryBoard binden.Geben Sie hier eine Bildbeschreibung ein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top