0
votes

I have a UITabBarController that contains 2 UIViewControllers. The 2nd UIViewController crashes when ever I try to show from the 1st UIViewController. The 2nd UIViewController crashes because of its UICollectionView declared as a private property. I get a EXC_BAD_ACCESS so I think that the 2nd UIViewController tries to do [self setCollectionView] but when its property self.collectionView is not init yet (still nil). I don't understand why it behaves so - I have no problem implementing the UICollectionView the same way in the 1st UIViewController. Here is the .m file of the 2nd UIViewController :

@interface WorkoutViewController () <UICollectionViewDataSource, UICollectionViewDelegate, DAPageControlViewDelegate>

@property (strong, nonatomic) UICollectionView *collectionView;
@property (strong, nonatomic) DAPageControlView *pageControlView;

@end

@implementation WorkoutViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    [self createCollectionView];

    [self createPageView];

    // Constraints

    // CollectionView
    [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];
    // PageControl
    [self.pageControlView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.trailing.equalTo(self.view);
        make.leading.equalTo(self.view);
        make.height.equalTo(screenAdjustedSizeFrom(15));
        make.bottom.equalTo(self.view).offset(screenAdjustedSizeFrom(-15).floatValue);
    }];

    // Wake up collectionView
    [self.collectionView reloadData];

}


-(void)createCollectionView {

    // Layout
    UICollectionViewFlowLayout *collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];
    collectionViewLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

    // UICollectionView
    self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:collectionViewLayout];
    self.collectionView.dataSource = self;
    self.collectionView.delegate = self;

    [self.view addSubview:self.collectionView];

    // Behavior
    self.collectionView.pagingEnabled = YES;

    // Appearance
    self.collectionView.backgroundColor = [Color colorWithName:nil alpha:0.2f];
    self.collectionView.showsHorizontalScrollIndicator = NO;

    // Register cells
    //[self.collectionView registerClass:[TrackingSetCollectionViewCell class] forCellWithReuseIdentifier:TrackingSetCollectionViewCellIdentifier]; }

-(void)createPageView {

    // Support for pagination - DAPageControlView
    self.pageControlView = [[DAPageControlView alloc] initWithFrame:CGRectZero];
    self.pageControlView.delegate = self;

    [self.view addSubview:self.pageControlView];
    self.pageControlView.hidden = YES; // do not show the dots
     }

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}

    -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

        return fetchManagedObjectsFromEntity(@"Autor", @[[NSSortDescriptor sortDescriptorWithKey:@"autorID" ascending:YES]], nil, self.managedObjectContext).count + 1; // +1 for testing !
    }

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

        //test

        UICollectionViewCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

        if (indexPath.row==0) {
            cell.backgroundColor = [UIColor blueColor];
        }
        if (indexPath.row==1) {
            cell.backgroundColor = [UIColor redColor];
        }

        return cell;
    }

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    return self.collectionView.bounds.size;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {

    return 0.0;
}

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {

    return UIEdgeInsetsMake(0, 0, 0, 0);
}

#pragma mark - DAPageControlView Delegate

- (void)pageControlViewDidChangeCurrentPage:(DAPageControlView *)pageControlView
{
    [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:pageControlView.currentPage inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
}
1

1 Answers

0
votes

Problem solved - I forgot to register a class for the UICollectionViewCell. I thought it was not necessary for to do so for the 'default' class UICollectionViewCell but since the UICollectionView is added programmatically, it makes sense.