当 UICollectionView 位于 iOS 中的自定义 TableViewCell 中时,如何为 UICollectionView 实现委托和数据源方法,目标 C

Posted

技术标签:

【中文标题】当 UICollectionView 位于 iOS 中的自定义 TableViewCell 中时,如何为 UICollectionView 实现委托和数据源方法,目标 C【英文标题】:How to implement delegate and datasource methods for UICollectionView when it is inside a custom TableViewCell in iOS, objective C 【发布时间】:2016-09-13 06:00:10 【问题描述】:

注意:我不想使用任何第三方库

我有 tableview 和自定义 table view cell(表格视图工作正常)。 现在在table view cell 内部我想实现一个collection view。 现在我的问题是,我应该在哪里为集合视图实现delegate 方法和data source 方法,它位于custom table view cell 内部。以下是我尝试过的。

表视图控制器实现

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return 5;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    FirstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tvcell"];

    return cell;

正常工作

现在这个FirstTableViewCell里面有一个collection view

这是我的 FirstTableViweCell.h 文件

#import <UIKit/UIKit.h>

@interface FirstTableViewCell : UITableViewCell<UICollectionViewDelegate,UICollectionViewDataSource>
@property (weak, nonatomic, nullable) IBOutlet UICollectionView *insideCollectionView;

@property (strong, nonnull,nonatomic) NSArray *mycollectionData;
- (void)setColletionData :(nonnull NSArray *)collectionData;

@end

这是我的 FirstTableViewCell.m 文件

#import "FirstTableViewCell.h"

@implementation FirstTableViewCell

- (void)awakeFromNib 
    [super awakeFromNib];
    self.insideCollectionView.delegate = self;

    // Initialization code


- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state


- (void)setColletionData:(NSArray *)collectionData

    self.mycollectionData = collectionData;
    [self.insideCollectionView reloadData];



- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

    return 1;


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    return 10;


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

    UICollectionViewCell *ccell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cvcell" forIndexPath:indexPath];
    return ccell;


@end

以下方法

- (void)setColletionData:(NSArray *)collectionData
    
        self.mycollectionData = collectionData;
        [self.insideCollectionView reloadData];
    

我曾经将array 设置为collectionView,在cellforrowatindexpath 中设置tableview

那么实现DataSourceDelegate的正确方法是什么 CollectionView 的方法在 Custom Table View Cell 内。

【问题讨论】:

你做得很好。 :) 【参考方案1】:

Horraaaaaaaay ..... =D 这是完整的答案。

表视图实现 .m 文件

#import "ViewController.h"
#import "FirstTableViewCell.h"

@interface ViewController ()

@end

@implementation ViewController

    NSArray *bbarray;
    


- (void)viewDidLoad 
    [super viewDidLoad];
    
    bbarray = [NSArray arrayWithObjects:@"33",@"44", nil];
    // Do any additional setup after loading the view, typically from a nib.


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


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return 5;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    FirstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tvcell"];
    
    [cell setColletionData:bbarray];
    
    return cell;


@end

自定义表格视图单元格内的实现

自定义表格视图 .h 文件

#import <UIKit/UIKit.h>
@interface FirstTableViewCell : UITableViewCell<UICollectionViewDelegate,UICollectionViewDataSource>
@property (weak, nonatomic, nullable) IBOutlet UICollectionView *insideCollectionView;

@property (strong, nonnull,nonatomic) NSArray *mycollectionData;
- (void)setColletionData :(nonnull NSArray *)collectionData;

@end

自定义表格视图 .m 文件

#import "FirstTableViewCell.h"

@implementation FirstTableViewCell


- (void)awakeFromNib 
    [super awakeFromNib];

    // These two are very important.
    self.insideCollectionView.delegate = self;
    self.insideCollectionView.dataSource = self;
   
    // Initialization code


- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state



//this method is used to set the data , call it in cell for row at index path in table view implementation.
    - (void)setColletionData:(NSArray *)collectionData
    
        self.mycollectionData = collectionData;
        [self.insideCollectionView reloadData];
    
    

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

    return 1;


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    NSLog(@"%lu", (unsigned long)self.mycollectionData.count);
    return [self.mycollectionData count];


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

    UICollectionViewCell *ccell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cvcell" forIndexPath:indexPath];
    return ccell;


@end

【讨论】:

【参考方案2】:

你所拥有的基本上是正确的。您需要的唯一真正更改是更新自定义单元格类中的集合视图数据源和委托方法,以便它们正确引用self.mycollectionData

例如。将numberOfItemsInSection 更改为:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    return self.mycollectionData.count;

【讨论】:

我做到了,并用断点检查。对于self.mycollectionData = collectionData;,它显示计数为2,但它没有在我的custom table view cell 中调用任何UICollectionViewdelegate 方法。我应该在awakeFromNib 方法中调用self.insideCollectionView.datasource = self; 是的,我必须调用 self.insideCollectionView.datasource = self;从笔尖方法中醒来。现在它工作正常。非常感谢,我支持你。

以上是关于当 UICollectionView 位于 iOS 中的自定义 TableViewCell 中时,如何为 UICollectionView 实现委托和数据源方法,目标 C的主要内容,如果未能解决你的问题,请参考以下文章

iOS UICollectionView - 如何让第一个单元格出现在集合视图的底部?

检测位于另一个 uicollectionview 内的 uicollectionView 的哪个 UICollectionViewCell 位于中心

iOS UICollectionView:具有交替网格对齐的圆形视图的单元格

为啥我的 UICollectionView 单元格在我的 swift ios 应用程序中不可点击?

iOS Swift UICollectionView 照片浏览 - 当单元格不可见时如何停止取消 DispatchQueue

Swift 3 - iOS 11.2上的UICollectionview问题