我知道关于这个主题还有其他问题,但是这里描述的解决方案都没有用,所以我会尝试解释我的问题并希望有人可以帮我解决。
我正在使用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:
。
答案 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];
}