2016-04-14 14 views
1

Ich weiß, es gibt andere Fragen zu diesem Thema, aber keine der dort beschriebenen Lösungen funktionierte, also werde ich versuchen, mein Problem zu erklären und hoffe, dass jemand mir helfen kann, es zu lösen.Sammlungsansicht nicht bevölkert

Ich verwende einen CollectionViewController, um ein Array von Objekten anzuzeigen. Ich dachte, dass das Aufrufen der Methoden zum Auffüllen meiner Arrays in der viewDidLoad-Methode der richtige Weg war, ist es aber nicht.

Kurz gesagt, ich habe einige Objekte, remote heruntergeladen, diese Objekte haben ein URL-Attribut, und ich möchte ein Array dieser URLs erstellen, die ich verwenden muss, um meine CollectionView zu füllen.

Das Problem ist, dass ich nicht habe meine Array von Objekten in der ViewDidLoad, so kann ich nicht meine Array von URLs erstellen und weiter gehen.

Das ist mein viewDidLoad Methode ist:

- (void)viewDidLoad { 
     [super viewDidLoad]; 
     [[self collectionView]setDataSource:self]; 
     [[self collectionView]setDelegate:self]; 
     [self.backgroundImage setImage:[UIImage imageNamed:@"app_background"]]; 
     objectModel = [[ObjectModel alloc] init]; 
     self.availableObjectsArray = [[NSMutableArray alloc] init]; 
     self.posterUrls = [[NSMutableArray alloc] init]; 
     [self createObjectArrayFromUrl:serverUrl intoArray:self.availableObjectsArray]; 
     //FIRST TRY NSMutableArray *postersUrlSection1 = [[NSMutableArray alloc] initWithArray:[self posterUrlsFromObjects:self.availableObjectsArray]]; 
    //SECOND TRY (AFTER ALLOC AND INIT) postersUrlSection1 = [self posterUrlsFromObjects:self.availableMoviesArray]; 
// [[self collectionView] reloadData]; ADDED AS PART OF THE SOLUTION BUT DIDN'T SOLVE THE ISSUE 
       NSLog(@"Array OBJECTS populated? %@", self.availableMoviesArray); 
       NSLog(@"Array URLS populated? %@", postersUrlSection1); 

     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = NO; 

     // Register cell classes 
     [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; 

     // Do any additional setup after loading the view. 
    // [self.collectionView reloadData]; ADDED AS A SOLUTION BUT NOT SOLVING MY ISSUE 
} 

ich es geschafft, das Hauptobjekt Array gefüllt zu bekommen: auch wenn es nichts im Protokoll in der viewDidLoad zeigen, lädt es irgendwie die Objekte, wenn ich will etwas mit ihnen im

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

Methode zu tun, aber natürlich, wenn ich es sofort muß (im viewDidLoad zum Beispiel), ist es nicht besiedelt bekommen. Wie bekomme ich es in der ViewDidLoad gefüllt, oder zumindest wie kann ich meine ObjectsArray verwenden, bevor die drei collectionViewController Methoden aufgerufen werden? Ich brauche das, weil ich dies zu tun haben:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
return [[self.posterUrls objectAtIndex:section] count]; 
} 

EDIT1:

Ich benutze diese Methode, um meine URL-Arrays zu füllen:

- (NSMutableArray *) posterUrlsFromObjects: (NSMutableArray *) objectsArray{ 
Object *object = [[object alloc]init]; 
NSMutableArray *posterUrls = [[NSMutableArray alloc] init]; 
NSURL *placeholder = [NSURL URLWithString:@"placeholder"]; 
for (NSInteger index = 0; index < [objectsArray count]; ++index) { 
    object = [objectsArray objectAtIndex:index]; 
    if (object.posterURL != nil) 
     [posterUrls addObject:[NSURL URLWithString:object.posterURL]]; 
    else 
     [posterUrls addObject:placeholder]; 
} 
return posterUrls;} 

Auch durch eine Zugabe von

[self.collectionView reloadData]; 

vor der Rückkehr, erhält es nicht das Array, wie es sein sollte.

EDIT2: Ja, ich befülle mein Hauptobjektarray auf eine asynchrone Weise.

- (void) createObjectArrayFromUrl: (NSString *) url intoArray: (NSMutableArray *) objectArray{ 
NSURL *URL = [NSURL URLWithString:url]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 
NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
             completionHandler: 
           ^(NSData *data, NSURLResponse *response, NSError *error) { 
            if(error) { 
             NSLog(@"Error"); 
            } 
            dispatch_async(dispatch_get_main_queue(), ^{ 
             NSMutableDictionary *jsonDataDictionary = [objectModel getRemoteJsonDataFromUrl:url]; 
             [movieArray removeAllObjects]; 
             [movieArray addObjectsFromArray:[objectModel arrayFromDictionary:jsonDataDictionary]]; 
             [[self collectionView] reloadData]; 

            }); 
           }]; 
[task resume]; 
} 

EDIT3:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 
    return 2; //LOG RETURNS 2 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
    return [self.availableMoviesArray count]; //LOG RETURNS 0 
    // WHAT I WANTED TO DO return [[self.posterUrls objectAtIndex:section] count]; 
} 

Die Methode collectionView:cellForItemAtIndexPath: aufgerufen wird.

+0

Meine Vermutung ist, dass Sie Ihr Array in einer asychronous Weise bevölkern, da Sie sagte: „Ich schaffte es das Hauptobjekt Array gefüllt zu bekommen: auch wenn es nichts im Protokoll in der viewDidLoad zeigen wird“. Können Sie den Code von 'createObjectArrayFromUrl: inArray:' anzeigen? – Larme

+0

Ich habe meine Frage bearbeitet, danke für deine Zeit. – DarthGalm

+0

In 'createObjectArrayFromUrl: inArray:' ist 'movieArray' aufgefüllt. Aber Sie kümmern sich nicht darum, da Sie in 'collectionView: numberOfItemsInSection:' nach 'posterUrls' suchen, das nur mit none object initialisiert wird. – Larme

Antwort

0

Zunächst werden die Methoden collectview methods delegate und data source aufgerufen. Sie können "collectionview reloadData" aufrufen, um die Delegate-Aufrufe erneut aufzurufen. Wenn Sie Ihr Array bei "methodA" auffüllen, bedeutet das. Sobald das Array bereit ist, rufen Sie [self.collectionview reloadData] auf. Dies löst alle Delegate- und Datenquellenmethoden erneut aus.

-(void)populateArray 
    { 
    [arrayObject addObject:@"valueOne"]; 
    [arrayObject addObject:@"valueTwo"]; 
    [arrayObject addObject :@"valuethree"]; 
    [arrayObject addObject:@"valueFour"]; 
    [self.collectionview reloadData]; 

    } 
+0

Ich habe die Frage bearbeitet, bitte sehen Sie sich um! – DarthGalm

Verwandte Themen