UICollectionView:在没有任何项目的部分中显示标签“No item”

时间:2015-12-30 09:07:37

标签: ios objective-c collectionview

我有一个UICollectionView有5个部分,有些部分有数据,有些部分(在我的代码中是第2部分)没有(它取决于服务器)
因此,我想在没有数据的选择中显示标签(“无项目”)。

然而,我可以找到任何想法,我希望任何人都可以给我一些建议或指示来实现它。
我真的很感激任何帮助

以下是我的介入部分代码

-(UICollectionReusableView *) collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{

        FriendsFanLevelHeaderView *headerView = (FriendsFanLevelHeaderView *)[self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"FanLevelHeader" forIndexPath:indexPath];

            switch (indexPath.section) {
                case 0:
                    [headerView.lblFanLevelTitle setText:@"Gold"];
                    break;
                case 1:
                    [headerView.lblFanLevelTitle setText:@"Silver"];
                    break;
                case 2:
                    [headerView.lblFanLevelTitle setText:@"Bronze"];
                    break;
                case 3:
                    [headerView.lblFanLevelTitle setText:@"Green"];
                    break;
                case 4:
                    [headerView.lblFanLevelTitle setText:@"Other"];
                    break;
                default:
                    break;
            }

            return headerView;
 }


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    switch (section) {
        case 0:
            return 3;
        case 1:
            return 0; // it doesn't have any item
        case 2:
            return 2;
        case 3:
            return 3;
        case 4:
            return 5;
        default:
            return 0;
    }
}

- (FriendsCollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
        FriendsCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"FriendsCollectionViewCell" forIndexPath:indexPath];

        [cell.lblFriendBand setText:@"Band: White Mash  "];
        [cell.lblFriendGenre setText:@"Freestyle house,  House,  Freestyle music,"];
        [cell.lblFriendECScore setText:@"EC score: 79"];

        return cell;
}

enter image description here

============================================

这就是我想要的

enter image description here

6 个答案:

答案 0 :(得分:4)

我们假设您拥有NSArray中每个部分的数据(项)。

所以你有goldSectionItems数组,silverSectionItems数组,bronzeSectionItems数组,greenSectionItems数组和otherSectionItems数组。

您想要做的是:

  1. 如果您要在显示的部分中显示某些项目
  2. 如果您要显示“无项目”部分中没有项目
  3. 在案例1中,您希望使用包含项目的数组向集合视图指示您的部分中包含的项目数。

    在案例2中,您希望向集合视图指出您有1个项目,这将是“无项目”单元格。

    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        switch (section) {
            case 0:
                return MAX(1, goldSectionItems.count);
            case 1:
                // return at least 1 when you have no items from the server.
                // When you do not have any items in
                // you NSArray then you return 1, otherwise you return
                // the number of items in your array
                return MAX(1, silverSectionItems.count);
            case 2:
                return MAX(1, bronzeSectionItems.count);
            case 3:
                return MAX(1, greenSectionItems.count);
            case 4:
                return MAX(1, otherSectionItems.count);
            default:
                return 0;
        }
    }
    

    注意: MAX将返回其两个操作数之间的最大值。例如,如果您的silverSectionItems数组为空,则count属性将返回0,因此MAX(1, 0)将返回1.如果您的silverSectionItems不为空{ {1}}将返回count(其中N),以便N>1返回MAX(1, N)

    然后在你的N中,你要检查你是哪个案例:

    如果您遇到案例1,则需要一个显示正常内容的单元格。

    如果您遇到案例2,则需要一个显示“无项目”的单元格。

    -collectionView:cellForItemAtIndexPath:

    感觉问任何你不明白的事情。

答案 1 :(得分:2)

您需要以与使用节标题相同的方式使用UICollectionElementKindSectionFooter。我构建简单的CollectionView示例来显示我的想法:

enter image description here

所以基本上我所做的就是创建通用页脚并在有内容填充单元格时隐藏它:

基本的例子是:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
    NSArray *sectionContent = self.collectionViewData[section][COLLECTIONVIEW_CONTENT_KEY];
    return ([sectionContent count] > 0) ? CGSizeMake(0, 0) : CGSizeMake(collectionView.frame.size.width, FOOTER_HEIGHT);
  }

我的self.collectionViewDataNSArray NSDictionary的位置。

但是为了避免违反约束,我强烈建议为页脚创建单独的xib并将其应用于您的collectionView。

-(UICollectionReusableView *) collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{

NSArray *sectionContent = self.collectionViewData[indexPath.section][COLLECTIONVIEW_CONTENT_KEY];

if([kind isEqualToString:UICollectionElementKindSectionHeader]) {
    UICollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath];
    return headerView;
} else {
    NSString *footerIdentifier = ([sectionContent count] > 0) ? @"blankFooter" : @"footer";
    UICollectionReusableView *footerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:footerIdentifier forIndexPath:indexPath];
    return footerView;
}
}

您可以在此处下载示例项目以查看:https://bitbucket.org/Kettu/so_34526276

Bitbucket to this repository

答案 2 :(得分:1)

我在我的一个项目中做过这个,但是我在集合视图的每个部分都使用了collectionView,以便横向滚动到每个部分,如下所示。你可能会有所了解

if (row==0)
{
    lblCoupons = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, collectionVCategory.frame.size.width, 50)];
  //  lblCoupons.tag = 99;
    [lblCoupons setText:@"No Coupons Found!"];
    [lblCoupons setTextAlignment:NSTextAlignmentCenter];
    [lblCoupons setFont:[UIFont systemFontOfSize:15]];
    [collctnView.backgroundView layoutSubviews];
    collctnView.backgroundView = lblCoupons;
}
else
{
    [lblCoupons removeFromSuperview];
    //[collectionVCategory.backgroundView removeAllSubviewsOfTag:99];
    collctnView.backgroundView = nil;
}

答案 3 :(得分:1)

如果你以这种格式获取数据,那么数组的每个索引本身都包含一个完整的数组。就像recipeImages包含3个对象一样,它们本身就是数组。

NSArray *mainDishImages = [NSArray arrayWithObjects:@"egg_benedict.jpg", @"full_breakfast.jpg", @"ham_and_cheese_panini.jpg", @"ham_and_egg_sandwich.jpg", nil];

NSArray *drinkDessertImages = [NSArray arrayWithObjects:@"green_tea.jpg", @"starbucks_coffee.jpg", @"white_chocolate_donut.jpg", nil];

NSArray *sideDishes = [NSArray arrayWithObjects:@"green_tea.jpg", @"starbucks_coffee.jpg", @"white_chocolate_donut.jpg", nil];

recipeImages = [NSArray arrayWithObjects:mainDishImages, drinkDessertImages, sideDishes ,nil];

您可以将集合视图中的部分数量指定为:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return [recipeImages count];
}

和每个部分中的行数

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return [[recipeImages objectAtIndex:section] count];
}

如果您的数据采用这种格式,您可以通过在特定部分获取数组来检查指定部分中是否有任何数据。

-(UICollectionReusableView *) collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{

NSArray *temp_arr_gold = [recipeImages objectAtIndex:0];
NSArray *temp_arr_silver = [recipeImages objectAtIndex:1];
NSArray *temp_arr_bronze = [recipeImages objectAtIndex:2];
NSArray *temp_arr_green = [recipeImages objectAtIndex:3];
NSArray *temp_arr_other = [recipeImages objectAtIndex:4];
FriendsFanLevelHeaderView *headerView = (FriendsFanLevelHeaderView *)[self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"FanLevelHeader" forIndexPath:indexPath];

switch (indexPath.section) {
    case 0:
        if (temp_arr_gold.count !=0)
        {
            [headerView.lblFanLevelTitle setText:@"Gold"];
        }
        else
        {
            [headerView.lblFanLevelTitle setText:@"No item"];
        }
        break;
    case 1:
        if (temp_arr_silver.count !=0)
        {
            [headerView.lblFanLevelTitle setText:@"Silver"];
        }
        else
        {
            [headerView.lblFanLevelTitle setText:@"No item"];
        }
        break;
    case 2:
        if (temp_arr_bronze.count !=0)
        {
            [headerView.lblFanLevelTitle setText:@"Bronze"];
        }
        else
        {
            [headerView.lblFanLevelTitle setText:@"No item"];
        }
        break;
    case 3:
        if (temp_arr_green.count !=0)
        {
            [headerView.lblFanLevelTitle setText:@"Green"];
        }
        else
        {
            [headerView.lblFanLevelTitle setText:@"No item"];
        }
        break;
    case 4:
        if (temp_arr_other.count !=0)
        {
            [headerView.lblFanLevelTitle setText:@"Other"];
        }
        else
        {
            [headerView.lblFanLevelTitle setText:@"No item"];
        }
        break;
    default:
        break;
}

return headerView;

}

希望它有所帮助..快乐编码。

答案 4 :(得分:1)

一种方法是在collectionView

中创建另一个单元格“No Item”

然后在hidden: false中总是返回最小值1,以便为“No Item”单元格腾出空间。

collectionView:numberOfItemsInSection:

答案 5 :(得分:1)

如果你想显示“无项目”标签,那么你需要在numberOfItemsInSection中返回1,然后当collectionview要求单元格时,取决于你的项目的实际数量,你可以返回“当indexpath的行号为1时,没有项目“标签或集合中的实际第一项。