单个UICollectionViewController中的多个自定义单元格,使用NavigationBarButton循环

时间:2016-01-22 19:36:03

标签: ios objective-c uicollectionview custom-cell

我曾经创建了三个不同的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连接,将所有标签和图像连接到相同的插座。 Collection View With 3 Custom Cells

正如您所看到的,我现在已经删除了三个视图控制器并将所有自定义单元格放入一个UICollectionView中。我已将所有标签和图像链接到相应的插座。

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

2 个答案:

答案 0 :(得分:2)

您只需要一个包含三个customCell的collectionView。

  

添加三个collectionViewCell用于不同的横向布局   每个buttonIdentifier。然后在每个按钮操作上,更改   reuseIdentifier并重新加载collectionView。

您就是这样做的:

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

NSString reuseIdentifier; 在实施部分。

然后在viewWillApper中设置默认标识符,该标识符是默认标识符。

reuseIdentifier=@"largeIconVIewCellIdentifier";

然后在导航栏按钮的按钮操作中,根据需要设置reuseIdentifier并重新加载集合视图。代码如下:

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

多数民众赞成!!你们都准备好了。 以下是供您参考的示例图像。

  

这三个customCell具有相同的类但重用次数不同   标识符

enter image description here

修改

#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。

答案 1 :(得分:0)

我建议使用enum并保留enum类型的属性。使用按钮切换enum,并在sizeForItemAtIndexPath:中根据enum为每个条件设置三种不同的尺寸。在按钮中切换尺寸后,请务必在设置属性后致电reloadData

如果单元格需要调整每个高度的布局(超出高度增加),您可以让单元格类拥有enum并在每个预期高度内应用样式。确保它是公开的,以便VC中的属性可以引用它并将其应用于cellForItemAtIndexPath:中的单元格以及sizeForItemAtIndex: