2 votes

Comment implémenter les méthodes delegate et datasource pour UICollectionView lorsqu'il est à l'intérieur d'un TableViewCell personnalisé dans iOS, objective C

Note : Je ne souhaite pas utiliser de bibliothèques tierces.

  • J'ai tableview avec avec un personnalisé table view cell (l'affichage du tableau fonctionne correctement).
  • Maintenant, à l'intérieur du table view cell Je souhaite mettre en œuvre un collection view .
  • Mon problème est maintenant de savoir où je dois implémenter la fonction delegate méthodes et data source pour la vue de la collection, qui se trouve à l'intérieur de l'élément custom table view cell Voici ce que j'ai essayé.

Mise en œuvre du contrôleur de vue de tableau

- (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;
}

fonctionner correctement

maintenant à l'intérieur de ce FirstTableViewCell il existe un collection view .

Voici mon fichier 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

et voici mon fichier 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

méthode suivante

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

J'avais l'habitude de régler le array para collectionView , en cellforrowatindexpath en tableview

Quelle est donc la bonne manière de mettre en œuvre DataSource y Delegate pour les CollectionView qui se trouve à l'intérieur du Custom Table View Cell .

2voto

Anuradh S Points 2725

Horraaaaaaaaaay ..... =D C'est la réponse complète à cette question.

Vue du tableau Mise en œuvre du fichier .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

Mise en œuvre à l'intérieur de la cellule Custom Table View

fichier .h de la vue de la table personnalisée

#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

fichier .m de la vue de la table personnalisée

#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

1voto

rmaddy Points 79279

Ce que vous avez est essentiellement correct. Le seul véritable changement dont vous avez besoin est de mettre à jour la source de données de la vue de collection et les méthodes de délégation dans la classe de cellule personnalisée afin qu'elles fassent correctement référence aux éléments suivants self.mycollectionData .

Par exemple. Modifier numberOfItemsInSection à :

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return self.mycollectionData.count;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X