将 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

获取按钮操作:UICollectionView Cell

将视图控制器添加到 UICollectionViewCell

将 UICollectionViewCell 加载到 UIView

使用 xib 将手势添加到 UICollectionViewCell 子视图

将 UIViewController 添加到 UICollectionViewCell