单个 UICollectionViewController 中的多个自定义单元格,在 NavigationBarButton 之间循环

Multiple Custom Cells in a single UICollectionViewController, Cycled between with a NavigationBarButton

我之前创建了三个不同的 UICollectionView,并将三个不同的自定义单元格放入每个单元格中,通过一个简单的选项卡栏按钮将它们链接在一起。在一些帮助之后,我设法将代码缩小到只有一个 UICollectionViewController,现在我只需要知道如何通过 NavigationBarButton 在每个自定义单元格之间切换。

如果我可以根据单击按钮的哪个选项更改按钮图标,这也会很有帮助(需要单击三次,如下所示(ListView、SmallIconView 和 LargeIconView))。

有什么建议吗?

ViewController.h

#import "GroupsViewController.h"
#import "CustomCell.h"

@interface GroupsViewController ()
{
    NSArray *arrayOfImages;
    NSArray *arrayOfDescriptions;
}

@end

@implementation GroupsViewController
{
    NSString *reuseIdentifier;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    reuseIdentifier= @"SmallIcon";
    [[self GroupsCollectionView]setDataSource:self];
    [[self GroupsCollectionView]setDelegate:self];


    arrayOfImages = [[NSArray alloc]initWithObjects:@"ac-cars.png", nil];
    arrayOfDescriptions = [[NSArray alloc]initWithObjects:@"one", nil];

}

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

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

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


    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

    [[cell IconImage]setImage:[UIImage imageNamed:[arrayOfImages objectAtIndex:indexPath.item]]];
    [[cell IconLabel]setText:[arrayOfDescriptions objectAtIndex:indexPath.item]];

    return SmallIcon; //error message (use of undeclared identifier)

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    //Dispose of any resources that can be recreated.
}

@end

CustomCell.h

#import <UIKit/UIKit.h>

@interface CustomCell : UICollectionViewCell

@property (weak, nonatomic) IBOutlet UIImageView *IconImage;
@property (weak, nonatomic) IBOutlet UILabel *IconLabel;

@end

我现在已将所有三个自定义单元格连接到一个 UICollectionView 中,将所有标签和图像连接到相同的插座。

如您所见,我现在已经删除了三个视图控制器并将所有自定义单元格放入一个 UICollectionView 中。我已将所有标签和图像链接到适当的渠道。

如何连接标签栏按钮?我在哪里实现按钮的代码?非常感谢

我建议使用 enum 并为 enum 类型保留 属性。使用按钮切换 enum,并在 sizeForItemAtIndexPath: 中根据 enum 为每个条件设置三个不同的大小。在按钮中切换大小时,请确保在设置 属性 后调用 reloadData

如果单元格需要根据高度调整其布局(不仅仅是增加高度),您可以让单元格 class 拥有 enum 并在其中为每个预期高度应用样式。确保它是 public,以便 VC 中的 属性 可以引用它并将其与 sizeForItemAtIndex:.

一起应用于 cellForItemAtIndexPath: 中的单元格

你只需要一个collectionView,其中包含三个customCell。

Add three collectionViewCell For the landscape layout with a different reuseIdentifier for each.Then on each button action,change the reuseIdentifier and reload the collectionView.

你是这样做的:

为 collectionViewCell 的 reuseIdentifier 声明一个 NSString 变量,例如:

NSString reuseIdentifier; 在实施部分。

然后在 viewWillApper 中为单元格设置默认标识符。

reuseIdentifier=@"largeIconVIewCellIdentifier";

然后在导航栏按钮的按钮动作中,根据需要设置reuseIdentifier并重新加载collectionview.The代码如下:

-(void)cellToggleAction
{
if([reuseIdentifier isEqualToString:@"SmallIcon"])
reuseIdentifier=@"ListView";
}
else if ([reuseIdentifier isEqualToString:@"ListView"])
reuseIdentifier=@"LargeIcon";
}
else if ([reuseIdentifier isEqualToString:@"LargeIcon"])
reuseIdentifier=@"SmallIcon";
}
[collectionView reloadData];
}

就是这样!!一切就绪。 以下是供您参考的示例图片。

These are three customCells with same class but different reuse identifiers.

编辑:

#import "GroupsViewController.h"
#import "CustomCell.h"

@interface GroupsViewController ()
{
    NSArray *arrayOfImages;
    NSArray *arrayOfDescriptions;
}

@end

@implementation GroupsViewController
{
        NSString *reuseIdentifier;

 }

- (void)viewDidLoad
{
    [super viewDidLoad];
      reuseIdentifier= @"SmallIcon";
    [[self GroupsCollectionView]setDataSource:self];
    [[self GroupsCollectionView]setDelegate:self];


    arrayOfImages = [[NSArray alloc]initWithObjects:@"ac-cars.png", nil];
    arrayOfDescriptions = [[NSArray alloc]initWithObjects:@"one", nil];
}

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

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

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


    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier1 forIndexPath:indexPath];

    [[cell SmallIconImage]setImage:[UIImage imageNamed:[arrayOfImages objectAtIndex:indexPath.item]]];
    [[cell SmallIconLabel]setText:[arrayOfDescriptions objectAtIndex:indexPath.item]];

    return SmallIcon;


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    //Dispose of any resources that can be recreated.
}

@end

并在 CustomCell.h 文件中:

        #import <UIKit/UIKit.h>

@interface CustomCell : UICollectionViewCell

//Small Icon
@property (weak, nonatomic) IBOutlet UIImageView *SmallIconImage;
@property (weak, nonatomic) IBOutlet UILabel *SmallIconLabel;
@end

同时添加我在上面添加的buttonAction。