单个 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。
我之前创建了三个不同的 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。