将 UICollectionViewCell 连接到一个简单的视图控制器标题
Posted
技术标签:
【中文标题】将 UICollectionViewCell 连接到一个简单的视图控制器标题【英文标题】:Connecting UICollectionViewCell to a simple View Controller Title 【发布时间】:2016-02-06 15:13:28 【问题描述】:我知道你会自动尝试说这与通过视图控制器页面发布传递数据相同,这不是因为在这种情况下它非常不同,以及何时引入 UIColletionView 因为似乎几乎没有任何信息它与 UITableView 相比。
所以这里的问题是我有一个 UICollectionView,它有 3 个名为 A B 和 C 图片的单元格,如下所示:
当我点击 UiCollectionViewCell“A”时,我希望它把我发送到一个新的空白 ViewController,该 ViewController 实现 UICollectionViewCell 标签(显示字母 A)到我的 UIViewController 标题。
我当前的代码如下,我已经知道我错过了我的 -void 为 segue 代码做准备,这就是我应该使用的对吗?而且我知道我应该选择 UIColcetionView 项目的代码,但这就是我正在努力设置的内容,对于我的一生,我一直在搜索互联网,这里有大约 300 个帖子了解如何做到这一点,没有记录或者我的搜索查询显然遗漏了一些重要的东西,我可以整天使用表格视图执行此操作,但从未使用过 comllcetionview,之前我会假设基于表格视图的先前代码代码会相似,但我只是不知道如何做我想做的事。
GroupsViewController.h
#import <UIKit/UIKit.h>
@interface GroupsViewController : UIViewController<UICollectionViewDataSource, UICollectionViewDelegate>
@property (weak, nonatomic) IBOutlet UICollectionView *GroupsCollectionView;
- (IBAction)cellToggleAction:(id)sender;
@end
GroupsViewController.m
#import "GroupsViewController.h"
#import "GroupsHomeViewController.h"
#import "CustomCell.h"
@interface GroupsViewController ()
NSArray *arrayOfImages;
NSArray *arrayOfDescriptions;
@end
@implementation GroupsViewController
NSString *reuseIdentifier;
- (void)viewDidLoad
[super viewDidLoad];
[[self GroupsCollectionView]setDataSource:self];
[[self GroupsCollectionView]setDelegate:self];
reuseIdentifier= @"SmallIcon";
arrayOfImages = [[NSArray alloc]initWithObjects:@"A.png",@"B.png",@"C.png",nil];
arrayOfDescriptions = [[NSArray alloc]initWithObjects:@"A",@"B",@"C",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 cell;
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
//Dispose of any resources that can be recreated.
// Toggle View Button
- (IBAction)cellToggleAction:(id)sender
if([reuseIdentifier isEqualToString:@"SmallIcon"])
reuseIdentifier=@"ListView";
[sender setImage:[UIImage imageNamed:@"LargeIcon"]];
else if
([reuseIdentifier isEqualToString:@"ListView"])
reuseIdentifier=@"LargeIcon";
[sender setImage:[UIImage imageNamed:@"SmallIcon"]];
else if
([reuseIdentifier isEqualToString:@"LargeIcon"])
reuseIdentifier=@"SmallIcon";
[sender setImage:[UIImage imageNamed:@"ListView"]];
[self.GroupsCollectionView reloadData];
//Toggled Cell Sizes
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
CGSize cellSize;
if([reuseIdentifier isEqualToString:@"SmallIcon"])
cellSize = CGSizeMake(100, 130);
else if
([reuseIdentifier isEqualToString:@"ListView"])
cellSize = CGSizeMake(320, 50);
else if
([reuseIdentifier isEqualToString:@"LargeIcon"])
cellSize = CGSizeMake(320, 350);
return cellSize;
@end
GroupsHomeViewController.h
#import <UIKit/UIKit.h>
@interface GroupsHomeViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIImageView *logoImage;
@property (strong, nonatomic) IBOutlet UILabel *groupLabel;
@end
GroupsHomeViewController.m
#import "GroupsHomeViewController.h"
@interface GroupsHomeViewController ()
@end
@implementation GroupsHomeViewController
-(void)viewDidLoad
[super viewDidLoad];
- (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
CustomCell.m
#import "CustomCell.h"
@implementation CustomCell
@end
如果您想了解更多信息以进一步了解我想要完成的工作,请不要犹豫,在下面发表评论,并提前感谢您的任何回答。
【问题讨论】:
【参考方案1】:您需要在 View 控制器中创建一个属性,以便在选择 Collection 视图单元格时导航到该属性。
所以在视图控制器的 .h 文件中添加
@property (nonatomic, strong) NSString* titleText;
并为此属性创建一个自定义设置器。这是我们将设置视图控制器标题的地方。
在视图控制器的 .m 文件中添加
- (void)setTitleText:(NSString *)titleText
_titleText = titleForNextVC;
// Set Title of your ViewController
self.title = _titleText;
现在您需要将CustomCell
中的GroupsViewController
中的字符串传递给下一个视图控制器。
为此在GroupsViewController.m
中实现collectionView:didSelectItemAtIndexPath:
方法
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
CustomCell* cell = [self collectionView:collectionView cellForItemAtIndexPath:indexPath];
_titleForNextVC = cell.IconLabel.text;
这里的titleForNextVC
只是GroupsViewController.m 类扩展中的NSString
属性。
@interface GroupsViewController ()
NSArray *arrayOfImages;
NSArray *arrayOfDescriptions;
NSString* _titleForNextVC;
现在,只需将此字符串传递给prepareForSegue:sender:
中下一个视图控制器的titleText
属性
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:yourSegueIdentifier])
// Replace YourNextViewController with actual class of your UIViewController
YourNextViewController *vc = (YourNextViewController *)segue.destinationViewController;
vc.titleText = _titleForNextVC;
你就完成了。
【讨论】:
在实现您的代码时,我收到了一些我无法弄清楚的错误?其中如下: _titleForNextVC = cell.IconLabel.text; (不兼容的指针类型使用“UICollectionViewCell”类型的表达式初始化“CustomCell”),第二个错误是声明 vc.titletext = _titleForNextVC; 的代码行; (在“GroupsHomeViewController”类型的对象上找不到属性titleText) 您是否将titleText
属性添加到您的GroupsHomeViewController.h
,如答案的第一行所述?对于不兼容的指针类型,尝试向CustomCell*
添加显式转换。 CustomCell* cell = (CustomCell *)[self collectionView:collectionView cellForItemAtIndexPath:indexPath];
以上是关于将 UICollectionViewCell 连接到一个简单的视图控制器标题的主要内容,如果未能解决你的问题,请参考以下文章
无法将 UILabel 添加到 UICollectionViewCell
将视图控制器添加到 UICollectionViewCell
将 UICollectionViewCell 加载到 UIView