2015-06-12 116 views
26

這可能是一個重複的職位,但我還沒有找到解決任何這樣:cellForItemAtIndexPath不叫,但numberOfItemsInSection確實

enter image description here

我設置我的UICollectionView爲:

UINib *nib = [UINib nibWithNibName:@"CollectionViewCell" 
          bundle:[NSBundle mainBundle]]; 
[_collectionView registerNib: nib forCellWithReuseIdentifier:@"bCell"]; 

(我試圖設置代表,沒有委託,等等)。

不過,只有

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section被調用,而

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath沒有。

我檢查了numberOfItemsInSection我返回,它總是> 0(它恰好爲17)。

我檢查過要致電[_collectionView reloadData];,也沒有任何反應。

我試過不同的東西,但我不能讓它工作。

而且,我UICollectionView應該是在這裏,但它不是:

enter image description here

沒有人有線索? 謝謝。

+0

你有沒有添加「numberofsectionsincollectionview」方法..?請把代表和數據源的方法,我們可以幫助你更多。 –

+1

'collectionView:cellForItemAtIndexPath:'只有在item存在時纔會被調用(即item存在於indexPath中)並且是可見的。例如,單元格的大小是多少?你是否在它們之間放置了一些「空間」,等等。你在主線程中調用'reloadData'嗎? – Larme

回答

23

好,我覺得這可能是這個未來的問題有用...

這是因爲故事板的限制。我不明白爲什麼會發生這種情況,因爲我只是固定了一個水平空間。我刪除了水平空間作爲該視圖的約束,一切工作正常。

好吧,讓我們生活吧。

+4

我錯過了身高限制。感謝提示。確實爲我節省了一些時間。 :) –

+0

很高興它的工作;-) –

+0

好吧,我知道我需要找到一個約束,導致這個問題,但我不知道哪些約束改變。有人可以解釋如何尋找? –

8

1. cellForItemAtIndexPath將在numberOfItemsInSection方法返回多於0項時調用。

2.檢查您的UICollectionViewFlowLayout是正確的還是您自己的。 UICollectionViewLayout是抽象類,你不能直接使用它

3.檢查集合視圖單元格的大小&集合視圖。

4.嘗試通過代碼設置您的collectionview大小。 [yourCollectionViewFlowLayout setItemSize:CGSizeMake(200,200)];

5.如果它們中的任何一個不起作用,那麼殺死XCode &重新啓動。有時它會解決這個問題。

蘋果表示

的UICollectionViewLayout類是繼承和使用,產生的集合佈局信息的抽象基類。佈局對象的工作是確定集合視圖邊界內的單元格,補充視圖和裝飾視圖的位置,並在被詢問時將該信息報告給集合視圖。集合視圖然後將提供的佈局信息應用於相應的視圖,以便它們可以在屏幕上呈現。

您必須繼承UICollectionViewLayout才能使用它。不過,在考慮子類化之前,您應該查看UICollectionViewFlowLayout類以查看它是否可以適應您的佈局需求。

+1

我沒有解釋得很好,但是這是關於數字的:**我檢查了我返回的計數,它總是> 0(它恰好爲17)。 ** –

+0

'collectionViewContentSize'不能是'.zero',否則'cellForItemAt'不會被調用。 –

1

什麼幫助我是設置正確itemSize。由於高度錯誤,我的cellForItemAtIndexPath未被調用。

所以我設置的大小爲:

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(170, 300)]; 
0

對我來說,問題是,我創建我的收藏查看編程,但我給了它CGRectZero作爲它的框架。我在viewDidLoad之後使用Auto Layout鋪設了它。如果我在視圖控制器加載時佈局收集視圖,它最終會正確調用cellForItemAtIndexPath:

10

我也面臨同樣的問題,終於知道,我已經通過了錯誤的類對象collectionViewLayout,我改變UICollectionViewFlowLayout,而不是UICollectionViewLayout而UICollectionView創建對象像下面的怔怔調用所有的委託方法。

collectionView = UICollectionView(frame: CGRectMake(5, 0, 400, 40) , collectionViewLayout: UICollectionViewFlowLayout()) 
+1

我剛剛花了大約2個小時 - 最終發現了這個錯誤,我希望我能在之前閱讀這個答案! – dotfreelancer

7

我也遇到過這個問題,我檢查了所有可能的問題,每件事情都看起來不錯。然後我嘗試更改重載方法。

[self.colView reloadData] - > [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:x]];

然後所有的東西都奏效了。但我仍然不明白如何。

+0

謝謝,男人真的很感謝你。 –

13

一下添加到viewDidLoad中:

self.automaticallyAdjustsScrollViewInsets = NO; 
+1

爲我工作。謝謝。 – shahil

+1

謝謝,我在這個問題上浪費了太多時間... – Storix

+0

最好的答案是,它浪費了我一天的時間。 – Zou

5

我剛剛發現cellForItemAtIndexPath沒有被調用(在iOS的10),只要至少一個單元具有零高度。

免責聲明:對不起,如果這應該是一個評論 - 沒有足夠的聲譽。

0

我有一個故事板與「標準」約束(底部,頂部,領先,追蹤固定到內部視圖)的集合視圖插座同樣的問題。

我解決了這種方式:

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
layout.itemSize = self.collectionView.frame.size 
0

對我來說是我的CollectionView的容器沒有translatesAutoresizingMaskIntoConstraints = false

0

我曾面臨類似的問題。問題在於部分中的numberOfItems。 如果節中的節數或節數小於零,則可能不會調用cellForRowAtIndexPath。

相關問題