如何从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

如何在 xamarin 中的 SQLite 数据库中显示 CollectionView 中的数据?

选择collectionView单元格时如何获取项目ID