Ios 我的UICollectionView不调用其数据源方法?

Ios 我的UICollectionView不调用其数据源方法?,ios,objective-c,uicollectionview,Ios,Objective C,Uicollectionview,我刚刚得到了一个带有UICollectionView的标准UIViewController子类。该UICollection视图未调用其数据源(或委托)方法,但我看不出缺少哪一部分 以下是显示UICollectionView的my UIViewController类的接口: @interface PastViewController () <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDeleg

我刚刚得到了一个带有
UICollectionView
的标准
UIViewController
子类。该
UICollection
视图未调用其数据源(或委托)方法,但我看不出缺少哪一部分

以下是显示UICollectionView的my UIViewController类的接口:

@interface PastViewController ()  <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>
...
@property (nonatomic, weak) UICollectionView *collectionView;
@end
最后,我还将发布数据源、委托和委托流布局协议。没有其他子视图添加到视图控制器,我已设置了委托并声明了委托协议,因此以下so帖子不适用:

我错过了什么?为什么永远不会调用数据源方法(和委托方法)

以下是针对各种协议实施的方法:

#pragma mark - UICollectionViewDataSource

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

    NSLog(@"should be seeing %d collection view cells", self.complaints.count);
    return self.complaints.count;
}


- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    NSLog(@"QUERYING NUMBER OF SECTIONS IN COLLECTION VIEW");
    return 1;
}


- (UICollectionViewCell  *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    VideoCollectionViewCell *cell = [[VideoCollectionViewCell alloc] initWithCoder:@"cell"];
    cell.complaint = self.complaints[indexPath.row];
    return cell;
}


#pragma mark - UICollectionViewDelegate

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"calling didselctitem at path");
}

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"diddeselectitem");
}


#pragma mar - UICollectionViewFlowDelegateLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    return CGSizeMake(100, 100);
}


- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(50, 20, 50, 20);
}
@property(非原子,强)UICollectionView*collectionView

weak
更改为
strong
,或
collectionView
将在赋值后发布,这意味着
collectionView
将为
nil
,因此永远不会调用数据源方法

另一种方法:

保持
collectionView

- (void)viewDidLoad {

    [super viewDidLoad];    


    UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc]init];
    flowLayout.itemSize = CGSizeMake(100, 100);
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];

    //self.complaints is used to generate the collection view cells
    //the log always prints out 30 complaints
    self.complaints = [self.complaintDatabase getComplaints ];
    NSLog(@"got a total OF %d complaints", self.complaints.count);

    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height) collectionViewLayout:flowLayout];
    collectionView.delegate = self;
    collectionView.dataSource = self;
    [collectionView registerClass:[VideoCollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
    [self.view addSubview:collectionView];
    self.collectionView = collectionView;

    [self.collectionView reloadData];
    [self.collectionView reloadInputViews];
}

请参阅:

不应声明属性strong。而是使用新的集合视图对象创建变量,将其添加到控制器视图,然后将其分配给属性。
- (void)viewDidLoad {

    [super viewDidLoad];    


    UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc]init];
    flowLayout.itemSize = CGSizeMake(100, 100);
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];

    //self.complaints is used to generate the collection view cells
    //the log always prints out 30 complaints
    self.complaints = [self.complaintDatabase getComplaints ];
    NSLog(@"got a total OF %d complaints", self.complaints.count);

    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height) collectionViewLayout:flowLayout];
    collectionView.delegate = self;
    collectionView.dataSource = self;
    [collectionView registerClass:[VideoCollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
    [self.view addSubview:collectionView];
    self.collectionView = collectionView;

    [self.collectionView reloadData];
    [self.collectionView reloadInputViews];
}