2015-05-26 2 views
0

Я пытаюсь показать представление коллекции, у которого есть пользовательская коллекция. Мой массив кажется пустым, и я не могу понять, почему. Вот мой код. Я все пробовал!AFNetworking & CollectionView

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"opportunityCell"; 
    OpportunityCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 
    // Opportunity *opportunity = [self.opportunitiesArray objectAtIndex:indexPath.row]; 
    for (Opportunity *opportunity in self.opportunitiesArray) { 
     NSString *opportunityBanner = opportunity.imageBanner; 
     NSURL *imageURl = [NSURL URLWithString:opportunityBanner]; 
     NSData *imageData = [NSData dataWithContentsOfURL:imageURl]; 
     RKCardView *cardView = [[RKCardView alloc]initWithFrame:CGRectMake(0, 0, cell.cellView.bounds.size.width, cell.cellView.bounds.size.height)]; 

     cardView.coverImageView.image = [[UIImage alloc]initWithData:imageData]; 
     cardView.titleLabel.text = @""; 
     cardView.profileImageView.image = [[UIImage alloc]initWithData:imageData]; 

     UITextView *descriptionView = [[UITextView alloc]initWithFrame:CGRectMake(15, 180, cell.cellView.bounds.size.width - 15, cell.cellView.bounds.size.height/3)]; 
     descriptionView.text = opportunity.opportunityName; 
     descriptionView.editable = NO; 
     descriptionView.font = [UIFont fontWithName:@"Avenir" size:18]; 
     descriptionView.contentMode = UIControlContentVerticalAlignmentCenter; 

     UITextView *timeView = [[UITextView alloc]initWithFrame:CGRectMake(15, 180 + cell.cellView.bounds.size.height, cell.cellView.bounds.size.width - 5, cell.cellView.bounds.size.height/3)]; 
     timeView.text = opportunity.endDateTime; 
     timeView.editable = NO; 
     timeView.font = [UIFont fontWithName:@"Avenir" size:14]; 
     cardView.layer.cornerRadius = 10; 
     cell.cellView.layer.cornerRadius = 10; 
     [cardView addSubview:descriptionView]; 
     [cardView addSubview:timeView]; 
     [cell.cellView addSubview:cardView]; 
     [descriptionView setTextAlignment:NSTextAlignmentCenter]; 
    } 
    [self.collectionView reloadData]; 

    return cell; 

} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]initWithBaseURL:[NSURL URLWithString:BaseURLString]]; 
    manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
    self.opportunitiesArray = [[NSMutableArray alloc]init]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    [manager GET:@"opportunities/" parameters:nil 
     success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     Opportunity * opportunity = [[Opportunity alloc]init]; 

     if (responseObject[@"opportunities"]) { 
      [KVNProgress showSuccess]; 
      NSDictionary *dataDict = responseObject[@"data"]; 
      opportunity.opportunityID = dataDict[@"id"]; 
      opportunity.opportunityDescription = dataDict [@"description"]; 
      // opportunity.isDonatable = dataDict[@"donatable"]; 
      opportunity.endDateTime = dataDict[@"end_datetime"]; 
      opportunity.opportunityName = dataDict[@"name"]; 
      opportunity.opportunityType = dataDict[@"opp_type"]; 
      opportunity.organizationID = dataDict[@"organization_id"]; 
      // opportunity.isPrivate = dataDict[@"donatable"]; 
      opportunity.startDateTime = dataDict[@"start_datetime"]; 
      // opportunity.isAttendable = dataDict[@"attendable"]; 
      opportunity.imagecard = dataDict[@"image_card_organization"]; 
      opportunity.imageBanner = dataDict[@"image_banner"]; 

      [self.opportunitiesArray addObject:opportunity]; 

     } 
     [self.collectionView reloadData]; 

     NSLog(@"JSON: %@", responseObject); 

    } 
     failure: 
    ^(AFHTTPRequestOperation *operation, NSError *error) { 

    }]; 
} 

Я также использую структуру под названием RKCardView для создания моей ячейки. Должен ли я создать пользовательскую ячейку вместо использования сторонней структуры?

+0

вы можете показать мне, где вы устанавливаете вид коллекции делегат и источник данных для себя код? Или просто подтвердите, если вы установили его в раскадровке или xib – Ted

+0

У вас есть это решение? – Mrunal

ответ

0

Вещи вы должны проверить

В источнике данных ViewDidLoad

  1. self.collectionView.datasource = self;
  2. делегат self.collectionView.delegate = self;
  3. зарегистрировать свой мобильный [self.collectionView registerClass:[OpportunityCollectionViewCell class] forCellWithReuseIdentifier:@"opportunityCell"];

пример кода

(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.collectionView.dataSource = self; 
    self.collectionView.delegate = self; 
    [self.collectionView registerClass:[OpportunityCollectionViewCell class] forCellWithReuseIdentifier:@"opportunityCell"]; 
    //use registerClass: or registerNib: 
    ... 
} 
0

Прежде всего, убедитесь, что self.opportunitiesArray имеет данные, которые вы хотите, это означает, что вы получите данные из сети

Во-вторых, убедитесь, что вы установили UICollectionView DataSource к действительным объект, как

self.collectionView.dataSource = self

Вы должны реализовать необходимые протоколы для UICollectionViewDataSource

Лучше убедиться, что [self.collectionView reloadData]; выполняется в главной очереди, вы вызываете его в блоке без основной очереди, существует риск.

Лучше использовать weakSelf в блоке, вы используете себя непосредственно, это приведет к retain cycle, если вы не будет осторожны

Использования, как показано ниже:

__weak typeof(self) weakSelf = self; 

dispatch_async(dispatch_get_main_queue(), ^{ 
     [weakSelf.collectionView reloadData]; 
}); 

Если бы вы могли использовать LLDB для отладки коды , будет очень полезно определить вашу проблему. Обычно я перечислял все возможные причины.

Вы можете попробовать добавить точку останова в cellForItemAtIndexPath и проверках, если вы получите правильный объект возможности и суб вид добавлены правильно

+0

Я просто проверил количество моего массива .. и по какой-то причине 0. Я не понимаю, как это могло быть 0, когда я добавил его, сделав это [я.возможностиArray addObject: возможность]; –

+0

у вас есть «возможность» получить то, что вы хотите, прежде чем добавить его в 'self.opportunitiesArray' – Wingzero

0

вы можете проверить свой код, я обычно addCollectionView использовать такой код:

- (void)addCollectionView { 
    CGRect collectionViewFrame = CGRectMake(0, kControllerHeaderViewHeight+kControllerHeaderToCollectionViewMargin, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); 
    UICollectionViewLeftAlignedLayout *layout = [[UICollectionViewLeftAlignedLayout alloc] init]; 
    self.collectionView = [[UICollectionView alloc] initWithFrame:collectionViewFrame collectionViewLayout:layout]; 
    // layout.headerReferenceSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, CYLFilterHeaderViewHeigt); //设置head大小 
    self.collectionView.dataSource = self; 
    self.collectionView.delegate = self; 
    self.collectionView.backgroundColor = [UIColor whiteColor]; 
    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:kCellIdentifier]; 
    self.collectionView.allowsMultipleSelection = YES; 
    [self.collectionView registerClass:[FilterHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kHeaderViewCellIdentifier]; 
    self.collectionView.showsHorizontalScrollIndicator = NO; 
    self.collectionView.contentInset = UIEdgeInsetsMake(15, 0, 0, 0); 
    self.collectionView.scrollsToTop = NO; 
    self.collectionView.scrollEnabled = NO; 
    [self.bgScrollView addSubview:self.collectionView]; 
} 

затем добавить метод CollectionViewDataSource как:

#pragma mark - UICollectionViewDataSource 

- (NSInteger)collectionView:(UICollectionView *)collectionView 
    numberOfItemsInSection:(NSInteger)section 
{ 
    return <#numberOfItemsInSection#>; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
        cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:<#reuseIdentifier#> forIndexPath:indexPath]; 

    [self configureCell:cell forItemAtIndexPath:indexPath]; 

    return cell; 
} 

- (void)configureCell:(UICollectionViewCell *)cell 
    forItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    <# statements #> 
} 
Смежные вопросы