如何从collectionview的数据源中获取项目数
Posted
技术标签:
【中文标题】如何从collectionview的数据源中获取项目数【英文标题】:How to get number of items from collectionview's data source 【发布时间】:2014-02-15 08:41:31 【问题描述】:我是 Collectionview
的新手,但不是 ios。我正在为我的 collectionview 使用自定义 Flowlayout。我需要根据 CollectionView 的数据源返回的当前项目数返回 contentsize。无论如何要知道flowlayout的collectionview中当前有多少项目?
@interface LatestNewsFlowLayout : UICollectionViewFlowLayout
-(id)initWithSize:(CGSize) size;
@end
@implementation LatestNewsFlowLayout
-(id)initWithSize:(CGSize) size
self = [super init];
if (self)
self.itemSize = size;
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
self.sectionInset = UIEdgeInsetsMake(0, 10.0, 0, 0);
self.minimumLineSpacing = 5;
return self;
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)oldBounds
return YES;
-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
NSArray *answer = [[super layoutAttributesForElementsInRect:rect] mutableCopy];
for(int i = 1; i < [answer count]; ++i)
UICollectionViewLayoutAttributes *currentLayoutAttributes = answer[i];
UICollectionViewLayoutAttributes *prevLayoutAttributes = answer[i - 1];
NSInteger maximumSpacing = 5;
NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame);
if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width)
CGRect frame = currentLayoutAttributes.frame;
frame.origin.x = origin + maximumSpacing;
currentLayoutAttributes.frame = frame;
return answer;
-(CGSize) collectionViewContentSize
CGSize size;
int numOfItems = ???
size.width = 100 * numOfItems;
size.height = 100;
return size;
【问题讨论】:
【参考方案1】:UICollectionViewFlowLayout 是 UICollectionViewLayout 的子类。因此它应该可以访问 UICollectionView,它应该知道有多少项目。
[self.collectionView numberOfItemsInSection:0];
如果您有多个部分,您可能需要遍历该部分以获取项目总数。
同样可以得到节数:
[self.collectionView numberOfSections];
希望这会有所帮助! :)
【讨论】:
太棒了。非常感谢:) 斯威夫特:collectionView.numberOfItems(inSection: 0)
【参考方案2】:
接下来是 Swifty 解决方案:
let itemsCount = Array(0..<collectionView.numberOfSections)
.map collectionView.numberOfItems(inSection: $0)
.reduce(0, +)
现在itemsCount
包含所有部分的集合视图项总数。
【讨论】:
【参考方案3】:如果你创建了一个名为 collectionView 的属性/插座,试试这个:
for (int i = 0; i<[collectionView numberOfSections];i++) //Iterate through all the sections in collectionView
for (int j = 0; j<[collectionView numberOfItemsInSection:i]; j++) //Iterate through all the rows in each section
numOfItems++;
【讨论】:
【参考方案4】:在 Swift 中,您可以编写以下内容(前提是您有一个包含节和项的数据源):
let totalItemCount = sections.reduce(0) result, section -> Int in
return result + section.items.count
只需将section
替换为您的数据源,将items
替换为项目集合名称即可。
【讨论】:
【参考方案5】:+ (NSInteger)countInCollectionView:(UICollectionView *)collectionView
NSInteger itemCount = 0;
for( int section = 0; section < [collectionView numberOfSections]; ++section )
itemCount += [collectionView numberOfItemsInSection:section];
return itemCount;
【讨论】:
【参考方案6】:我喜欢Vadim's answer,因为它既快速又干净,但是我们从一个范围创建一个数组并循环它两次(map 和 reduce)。我建议直接使用只有一个循环的范围(减少)的类似解决方案:
let totalItems = (0..<collectionView.numberOfSections)
.reduce(0) res, cur in
res + collectionView.numberOfItems(inSection: cur)
就我而言,我最终为UICollectionView
创建了一个扩展:
extension UICollectionView
var totalItems: Int
(0..<numberOfSections).reduce(0) res, cur in
res + numberOfItems(inSection: cur)
然后就是:
collectionView.totalItems
【讨论】:
以上是关于如何从collectionview的数据源中获取项目数的主要内容,如果未能解决你的问题,请参考以下文章
获取 TableviewCells 以显示从 firebase 提取的不同数据并在 CollectionView 中显示它们
添加新数据时如何在保持秩序的同时重新加载collectionview
Xamarin.Forms 如何将数据从 CollectionView 传输到不同的视图?
当点击collectionView单元格内的按钮时,如何从tableViewCell内的collectionView获取表视图行并推送到viewController