未调用 cellForItemAtIndexPath 但调用了 numberOfItemsInSection
cellForItemAtIndexPath not called but numberOfItemsInSection does
这可能是重复的post,但我还没有找到解决方案。
我将 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 我 return,它总是 > 0(恰好是 17)。
我已经检查过调用 [_collectionView reloadData];
,但也没有任何反应。
我尝试了不同的方法,但我无法让它工作。
此外,我的 UICollectionView
应该在这里,但它不是:
有人知道吗?
谢谢。
1.当您 return numberOfItemsInSection 方法上的项目超过 0 个时,将调用 cellForItemAtIndexPath。
2。检查您的 UICollectionViewFlowLayout 是否正确或您自己的。 UICollectionViewLayout是抽象的class不能直接使用
3。检查集合视图单元格和集合视图的大小。
4.尝试在代码中设置您的 collectionview 大小。
[yourCollectionViewFlowLayout setItemSize:CGSizeMake(200, 200)];
5.If 它们中的任何一个都不起作用,然后杀死 XCode 并重新启动。有时它会解决问题。
苹果说
UICollectionViewLayout class 是一个抽象基础 class,您可以将其子class 并用于生成集合视图的布局信息。布局对象的工作是确定单元格、补充视图和装饰视图在集合视图边界内的位置,并在被询问时将该信息报告给集合视图。然后,集合视图将提供的布局信息应用到相应的视图,以便它们可以显示在屏幕上。
您必须子class UICollectionViewLayout 才能使用它。不过,在您考虑 subclassing 之前,您应该查看 UICollectionViewFlowLayout class 看看它是否可以适应您的布局需求。
好的,我认为这可能有助于解决未来的问题...
是因为 StoryBoard 的限制。我真的不明白为什么会这样,因为我刚刚修复了一个水平 space。我删除了水平 space 作为该视图的约束,一切正常。
好吧,让我们的生活流淌吧。
设置正确的 itemSize
对我有帮助。我的 cellForItemAtIndexPath
由于身高错误而没有被调用。
所以我将大小设置为:
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(170, 300)];
对我来说,问题是我正在以编程方式创建我的 Collection 视图,但我已将它 CGRectZero
作为其框架。我在 viewDidLoad
之后使用自动布局对其进行布局。如果我在加载视图控制器时布置 collection 视图,它最终会正确调用 cellForItemAtIndexPath:
。
我也面临同样的问题,最后知道我为 collectionViewLayout 传递了错误的 class 对象,我改为 UICollectionViewFlowLayout 而不是 UICollectionViewLayout 在为 UICollectionView 创建对象时如下所示,它盯着调用所有委托方法。
collectionView = UICollectionView(frame: CGRectMake(5, 0, 400, 40) , collectionViewLayout: UICollectionViewFlowLayout())
我也遇到了这个问题。我检查了所有可能的问题,一切看起来都很好。然后我尝试更改重新加载方法。
[self.colView reloadData]
-> [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:x]];
然后一切正常。但是我还是不明白。
将此添加到 viewDidLoad:
self.automaticallyAdjustsScrollViewInsets = NO;
我刚刚发现只要至少一个单元格的高度为零,就会调用 cellForItemAtIndexPath 的 NONE(在 iOS 10 中)。
免责声明:抱歉,如果这应该是评论 - 信誉不够。
我在具有 "standard" 约束(底部、顶部、前导、尾随固定到内部视图)的情节提要板上遇到了同样的问题。
我是这样解决的:
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = self.collectionView.frame.size
对我来说,我的 collectionView 容器没有 translatesAutoresizingMaskIntoConstraints = false
我遇到过类似的问题。问题在于部分中的 numberOfItems。
如果您的节数或节中的行数低于零,则可能不会调用您的 cellForRowAtIndexPath。
对我来说,cellForItemAtIndexPath 在我将 collectionView 的约束设置为 0 然后再次将其设置为其实际大小后第一次没有被调用。
@IBOutlet weak var collectionVwHeightContraint: NSLayoutConstraint!
if attachments.count > 0 {
collectionVwHeightContraint.constant = 100
}else {
collectionVwHeightContraint.constant = 0
}
// collectionVwHeightContraint is my collectionView height Contraint outlet
我通过调用解决了这个问题:
self.view.layoutIfNeeded()
希望对大家有所帮助:)
就我而言,我弄乱了自定义单元格标签约束。再次验证您的约束条件。
reza_khalafi 答案对我有用,我使用的是 Xcode 11 和 swift 4.2。
swift 4.2 版本的 reza 的答案。
在 viewDidLoad 上添加这个
self.automaticallyAdjustsScrollViewInsets = false
可能会帮助其他人,可能是两件事:
- 单元格的高度计算不正确,需要检查单元格的约束。
为了解决这个问题,我实现了 UICollectionViewLayout 的方法:
扩展 TableViewCellActionItemPageControl:UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 414, height: 213)
}
- 另一种可能性是:返回的集合视图单元格的大小大于集合视图本身。确保你的单元格的高度小于你的集体的高度。
在我的例子中,collectionViewCell 的高度大于 CollectionView 的高度。
就我而言,它是交替工作的。
然后我在主线程上 运行 reloadData() 并解决了问题。
但后来经过某些更改后再次出现同样的问题。最后,我做了如下所示。现在没问题了,感觉self.view.layoutIfNeeded()起着关键作用
DispatchQueue.main.async {
self.view.layoutIfNeeded()
self.collectionView.reloadData()
}
要完成@frank 的回答:(快速回答)
extension UICollectionView {
func reloadFirstSection() {
let indexPath = IndexPath(item: 0, section: 0)
reloadSections(IndexSet(integer: indexPath.section) )
}
}
然后调用 collectionView.reloadFirstSection()
而不是 collectionView.reloadData()
这可能是重复的post,但我还没有找到解决方案。
我将 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 我 return,它总是 > 0(恰好是 17)。
我已经检查过调用 [_collectionView reloadData];
,但也没有任何反应。
我尝试了不同的方法,但我无法让它工作。
此外,我的 UICollectionView
应该在这里,但它不是:
有人知道吗? 谢谢。
1.当您 return numberOfItemsInSection 方法上的项目超过 0 个时,将调用 cellForItemAtIndexPath。
2。检查您的 UICollectionViewFlowLayout 是否正确或您自己的。 UICollectionViewLayout是抽象的class不能直接使用
3。检查集合视图单元格和集合视图的大小。
4.尝试在代码中设置您的 collectionview 大小。 [yourCollectionViewFlowLayout setItemSize:CGSizeMake(200, 200)];
5.If 它们中的任何一个都不起作用,然后杀死 XCode 并重新启动。有时它会解决问题。
苹果说
UICollectionViewLayout class 是一个抽象基础 class,您可以将其子class 并用于生成集合视图的布局信息。布局对象的工作是确定单元格、补充视图和装饰视图在集合视图边界内的位置,并在被询问时将该信息报告给集合视图。然后,集合视图将提供的布局信息应用到相应的视图,以便它们可以显示在屏幕上。
您必须子class UICollectionViewLayout 才能使用它。不过,在您考虑 subclassing 之前,您应该查看 UICollectionViewFlowLayout class 看看它是否可以适应您的布局需求。
好的,我认为这可能有助于解决未来的问题...
是因为 StoryBoard 的限制。我真的不明白为什么会这样,因为我刚刚修复了一个水平 space。我删除了水平 space 作为该视图的约束,一切正常。
好吧,让我们的生活流淌吧。
设置正确的 itemSize
对我有帮助。我的 cellForItemAtIndexPath
由于身高错误而没有被调用。
所以我将大小设置为:
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(170, 300)];
对我来说,问题是我正在以编程方式创建我的 Collection 视图,但我已将它 CGRectZero
作为其框架。我在 viewDidLoad
之后使用自动布局对其进行布局。如果我在加载视图控制器时布置 collection 视图,它最终会正确调用 cellForItemAtIndexPath:
。
我也面临同样的问题,最后知道我为 collectionViewLayout 传递了错误的 class 对象,我改为 UICollectionViewFlowLayout 而不是 UICollectionViewLayout 在为 UICollectionView 创建对象时如下所示,它盯着调用所有委托方法。
collectionView = UICollectionView(frame: CGRectMake(5, 0, 400, 40) , collectionViewLayout: UICollectionViewFlowLayout())
我也遇到了这个问题。我检查了所有可能的问题,一切看起来都很好。然后我尝试更改重新加载方法。
[self.colView reloadData]
-> [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:x]];
然后一切正常。但是我还是不明白。
将此添加到 viewDidLoad:
self.automaticallyAdjustsScrollViewInsets = NO;
我刚刚发现只要至少一个单元格的高度为零,就会调用 cellForItemAtIndexPath 的 NONE(在 iOS 10 中)。
免责声明:抱歉,如果这应该是评论 - 信誉不够。
我在具有 "standard" 约束(底部、顶部、前导、尾随固定到内部视图)的情节提要板上遇到了同样的问题。
我是这样解决的:
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = self.collectionView.frame.size
对我来说,我的 collectionView 容器没有 translatesAutoresizingMaskIntoConstraints = false
我遇到过类似的问题。问题在于部分中的 numberOfItems。 如果您的节数或节中的行数低于零,则可能不会调用您的 cellForRowAtIndexPath。
对我来说,cellForItemAtIndexPath 在我将 collectionView 的约束设置为 0 然后再次将其设置为其实际大小后第一次没有被调用。
@IBOutlet weak var collectionVwHeightContraint: NSLayoutConstraint!
if attachments.count > 0 {
collectionVwHeightContraint.constant = 100
}else {
collectionVwHeightContraint.constant = 0
}
// collectionVwHeightContraint is my collectionView height Contraint outlet
我通过调用解决了这个问题:
self.view.layoutIfNeeded()
希望对大家有所帮助:)
就我而言,我弄乱了自定义单元格标签约束。再次验证您的约束条件。
reza_khalafi 答案对我有用,我使用的是 Xcode 11 和 swift 4.2。 swift 4.2 版本的 reza 的答案。
在 viewDidLoad 上添加这个
self.automaticallyAdjustsScrollViewInsets = false
可能会帮助其他人,可能是两件事:
- 单元格的高度计算不正确,需要检查单元格的约束。
为了解决这个问题,我实现了 UICollectionViewLayout 的方法: 扩展 TableViewCellActionItemPageControl:UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 414, height: 213)
}
- 另一种可能性是:返回的集合视图单元格的大小大于集合视图本身。确保你的单元格的高度小于你的集体的高度。
在我的例子中,collectionViewCell 的高度大于 CollectionView 的高度。
就我而言,它是交替工作的。 然后我在主线程上 运行 reloadData() 并解决了问题。 但后来经过某些更改后再次出现同样的问题。最后,我做了如下所示。现在没问题了,感觉self.view.layoutIfNeeded()起着关键作用
DispatchQueue.main.async {
self.view.layoutIfNeeded()
self.collectionView.reloadData()
}
要完成@frank 的回答:(快速回答)
extension UICollectionView {
func reloadFirstSection() {
let indexPath = IndexPath(item: 0, section: 0)
reloadSections(IndexSet(integer: indexPath.section) )
}
}
然后调用 collectionView.reloadFirstSection()
collectionView.reloadData()