UICollectionView数据源了解问题

时间:2014-03-20 11:33:12

标签: ios uicollectionview

我对UIColectionView的数据源感到困惑,我真的需要帮助。

我有对象[@"1", @"2", @"3", @"4", @"5", @"6"]

的数组

所以我需要显示它们

1 2 3
4 5 6

我找到了这段代码

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return  noOfItem/ noOfSection;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return noOfSection;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *CellIdentifier = @"cellRecipe";    
     collectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
  ;

    Employee *emp = [array_ objectAtIndex:indexPath.section * noOfSection + indexPath.row];
    cell.name.text = emp.name;
    cell.image.image = emp.thumbImg;

    return cell;
}

但我认为使用noOfItem / noOfSection

并不好

所以例如,如果我有20个对象和每个部分3个项目

我收到了这个错误

-[__NSArrayM objectAtIndex:]: index 20 beyond bounds [0 .. 19]'

因为我的每个部分都有3个项目

3 个答案:

答案 0 :(得分:2)

在我看来,你并没有以正确的方式接近UICollectionView。

部分是指内容的单独部分,而不是行数。 部分中的项目旨在返回给定部分的项目数。

在你的例子中我会这样做:

/**
 *  Called after the controller’s view is loaded into memory.
 */
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.employees = @[[[Employee alloc] init], [[Employee alloc] init], [[Employee alloc] init], [[Employee alloc] init], [[Employee alloc] init]];
}

/**
 *  Asks the data source for the number of sections in the collection view.
 *
 *  @param  collectionView              An object representing the collection view requesting this information.
 *
 *  @return The number of sections in collectionView.
 */
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

/**
 *  Asks the data source for the cell that corresponds to the specified item in the collection view.
 *
 *  @param  collectionView              An object representing the collection view requesting this information.
 *  @param  indexPath                   The index path that specifies the location of the item.
 *
 *  @return A configured cell object. You must not return nil from this method.
 */
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cellRecipe";    
    collectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
    Employee *employee = self.items[indexPath.item];
    cell.name.text = employee.name;
    cell.image.image = employee.thumbImg;
    return cell;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return self.items.count;
}

答案 1 :(得分:1)

参考包含[@“1”,@“2”,@“3”,@“4”,@“5”,@“6”的数组

您不需要这种方法:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

现在这样做:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return [self.arrayName count];
}

现在您需要设置单元格的大小,以便每行可以有3个项目。您可以使用故事板设置单元格的大小,也可以使用此方法:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout  *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

答案 2 :(得分:0)

真。你真的不需要numberOfSections ......因为你可以通过调整单元格来解决这个问题(autolayout是你的朋友)。如果使用numberOfSectionsInCollectionView,则需要捕获最后一部分只有两个项目。您没有包括如何计算noOfSection。

在numberOfItems ...方法中,您可以这样做:

if (section == noOfSection) {
    return noOfItem % noOfSection; // Finding the remainder with modulo
} else {
    return noOfItem / noOfSection;
}

我没有对此进行测试,但相信它应该可行。