当 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
那么实现
DataSource
和Delegate
的正确方法是什么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
中调用任何UICollectionView
delegate
方法。我应该在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