集合视图未填充

时间:2016-04-14 10:42:24

标签: ios objective-c uicollectionview

我知道关于这个主题还有其他问题,但是这里描述的解决方案都没有用,所以我会尝试解释我的问题并希望有人可以帮我解决。

我正在使用CollectionViewController来显示一个对象数组。 我认为在viewDidLoad方法中调用填充数组的方法是正确的方法,但事实并非如此。

简而言之,我有一些对象,远程下载,这些对象有url属性,我想创建一个我需要用来填充我的collectionView的网址数组。

问题是我没有viewDidLoad中可用的对象数组,所以我无法创建我的url数组并进一步。

这是我的viewDidLoad方法:

- (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
}

我设法填充了主对象数组:即使它没有在viewDidLoad的日志中显示任何内容,如果我想在

中对它们执行某些操作,它会以某种方式加载对象
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

方法,但显然如果我马上需要它(例如在viewDidLoad中),它就不会被填充。 如何在viewDidLoad中填充它,或者至少如何在调用三个主collectionViewController方法之前使用objectsArray? 我需要这个,因为我必须这样做:

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

EDIT1:

我使用此方法填充我的url数组:

- (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;}

即使添加了

[self.collectionView reloadData];

在返回之前,它不会按原样填充数组。

EDIT2: 是的我以异步方式填充主对象数组。

    - (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];
}

调用方法collectionView:cellForItemAtIndexPath:

1 个答案:

答案 0 :(得分:0)

最初将收集delegview方法delegate和datasource方法。您可以调用“collectionview reloadData”来再次调用委托调用。如果在“methodA”中填充数组,则表示,。一旦数组准备就绪,请调用[self.collectionview reloadData]。这将再次触发所有委托和数据源方法。

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

   }