2015-06-24 47 views
1

我剛剛有一個標準UIViewController子類UICollectionView。那UICollection視圖不調用它的數據源(或委託)方法,但我看不到哪一塊丟失。我的UICollectionView不調用它的數據源方法?

下面是呈現UICollectionView爲我UIViewController類接口:

@interface PastViewController() <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout> 
... 
@property (nonatomic, weak) UICollectionView *collectionView; 
@end 

這裏是我的viewDidLoad(幾乎)的全部:

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

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


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

我還會發布的數據源,委託,並在最後委託流佈局協議。有添加到視圖控制器沒有其他的子視圖,我已經設置委託,宣佈委託協議,因此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); 
} 

回答

0

@property (nonatomic, strong) UICollectionView *collectionView;

變化weakstrong,或collectionView將分配之後被釋放,這意味着collectionViewnil使得數據源方法永遠不會被調用。

另一種方法:

保持collectionViewweak

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

參見:Creating views programmatically Strong Vs Weak subviews in controller

+1

你不應該申報財產強勁。相反,使用新的集合視圖對象創建一個變量,將其添加到控制器視圖並將其分配給屬性。 [更多信息](https://www.google.de/search?q=uiview+weak+property&ei=UPGKVfXYIsKosAGGrJaYDw#q=site:stackoverflow.com+uiview+weak+vs+strong+property+programmatically) – vikingosegundo

+0

你是對。我應該在我的帖子中提到這一點。 – user3480295

相關問題