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

UICollectionView: Show label "No item" in the section that don't have any item

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

但是,我可以找到任何想法来做到这一点,我希望任何人都可以给我一些建议或指导来实现它。
我真的很感激任何帮助

这是我的 intergrade 部分代码

-(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;
}

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

这就是我想要的

我在我的一个项目中这样做过,但我在集合视图的每个部分中使用 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;
}

如果您以数组本身的每个索引都包含一个完整数组的格式获取数据。像 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;

}

希望对您有所帮助。祝您编码愉快。

一种方法是在 collectionView

中创建另一个单元格 "No Item"

然后在 collectionView:numberOfItemsInSection: 中总是 return 最小 1 为 "No Item" 单元格腾出空间。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    // TODO: check dataSource array for "NO FRIENDS"
    // TODO: If true 
    // NoFriendsCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"NoFriendsCollectionViewCell" forIndexPath:indexPath];
    // cell.label.text = "No Item";
    // return cell;
    // else

    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;
}

如果你想显示"no item"标签,那么你需要在numberOfItemsInSection中return 1,然后当collectionview要求单元格时,取决于你的项目的实际计数,当索引路径的行号为 1 时,您可以 return "no item" 标签或集合中的实际第一项。

假设您在 NSArray.

中的每个部分都有数据(项目)

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

您想做的是:

  1. 当您想要显示部分中的某些项目时
  2. 当您想要显示的部分中没有项目时 "No item"

在情况 1 中,您希望使用包含您的项目的数组向集合视图指示您的部分中的项目数。

在情况 2 中,您想向集合视图指示您有 1 个项目,这将是 "No item" 单元格。

- (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会return其两个操作数之间的最大值。例如,如果您的 silverSectionItems 数组为空,那么 count 属性 将 return 0,因此 MAX(1, 0) 将 return 1 . 如果你的 silverSectionItems 不为空 count 将 return N (其中 N>1)所以 MAX(1, N) 将 return N.

然后在你的 -collectionView:cellForItemAtIndexPath: 中你想检查你是哪种情况:

如果您属于情况 1,您需要一个显示正常内容的单元格。

如果您属于情况 2,您需要一个显示 "No item".

的单元格
- (FriendsCollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    FriendsCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"FriendsCollectionViewCell" forIndexPath:indexPath];
    // get the array that contains the items for your indexPath
    NSArray *items = [self itemArrayForIndexPath:indexPath];

    // case 2
    // if the section does not have any items then set up the
    // cell to display "No item" 
    if (items.count == 0) {
        [cell.lblFriendBand setText:@"No item"];
        [cell.lblFriendGenre setText:@""];
        [cell.lblFriendECScore setText:@""];
    }
    // case 1
    // setup the cell with your items
    else {
        // get you item here and set up the cell with your content
        // Item *item = items[indexPath.item];
        [cell.lblFriendBand setText:@"Band: White Mash  "];
        [cell.lblFriendGenre setText:@"Freestyle house,  House,  Freestyle music,"];
        [cell.lblFriendECScore setText:@"EC score: 79"];
    }

    return cell;
}

// return array for the corresponding indexPath
- (NSArray *)itemArrayForIndexPath:(NSIndexPath *)indexPath {
    switch (indexPath.section) {
        case 0:
            return goldSectionItems;
        case 1:
            return silverSectionItems;
        case 2:
            return bronzeSectionItems;
        case 3:
            return greenSectionItems;
        case 4:
            return otherSectionItems;
        default:
            return nil;
    }
}

-(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;
}

有什么不懂的就来问吧

您需要像使用 header 部分一样使用 UICollectionElementKindSectionFooter。我构建了简单的 CollectionView 示例来展示我的想法:

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

基本示例是:

- (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.collectionViewDataNSDictionaryNSArray

但是为了避免破坏约束,我强烈建议为页脚创建单独的 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