Bonjour,
Je souhaite imbriquer des TableView dans des TablesCell pour afficher des listes imbriquées sans changer de vue…
A terme, j’aurai 4 niveaux de liste, mais j’essaie déjà de régler le cas à 2 niveaux :
J’ai un ViewController qui me permet de gérer une vue avec 2 TableView indépendantes :
@interface DetailsDossierViewController : UIViewController<UITableViewDelegate, UITableViewDataSource, donnerListeActesDossier_V2Protocol>
@property (nonatomic, strong) WS_WTActeDossier_V2 *dossier;
@property (weak, nonatomic) IBOutlet UILabel *lblReferenceDossier;
@property (weak, nonatomic) IBOutlet UITableView *tableViewReglements;
@property (weak, nonatomic) IBOutlet UITableView *tableViewActes;
@end
Dans l’implémentation, j’affecte le Delegate et le DataSource des TablesView :
-(void) viewDidLoad{
[super viewDidLoad];
tableViewActes.delegate = self;
tableViewActes.dataSource = self;
tableViewReglements.delegate = self;
tableViewReglements.dataSource = self;
}
J’ai ensuite défini les différentes méthodes pour les tablesView, notamment :
- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSInteger count;
if (tableView == tableViewReglements) {
count = [dossier.REGLEMENTS count];
} else {
count = [dossier.LISTE_ACTE count];
}
return count;
}
// Customize the appearance of table view cells.
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
static NSString *reglementCell = @"ReglementCell";
static NSString *acteCell = @"ActeCell";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:FORMAT_DATE];
if (tableView == tableViewReglements) {
ReglementCell *cell = [tableView dequeueReusableCellWithIdentifier:reglementCell];
if (cell == nil) {
cell = [[ReglementCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reglementCell];
}
WS_WM_DossierReglement_V2 *reglement = [self.dossier.REGLEMENTS objectAtIndex:indexPath.row];
NSString *modeReglement = @"";
if ([reglement.LB_MODE isEqualToString:@"I"]) {
modeReglement = [NSString stringWithFormat:@"Retenue d'indu sur le dossier n° %f", reglement.NO_DOS_INDU];
} else {
modeReglement = [NSString stringWithFormat:@"Virement sur compte %@", reglement.CO_IBAN];
}
cell.lblReglement.text = modeReglement;
cell.lblMontant.text = [NSString stringWithFormat:FORMAT_MONTANT_EURO, reglement.MT_REGLE];
return cell;
}
else if (tableView == tableViewActes) {
ActeSommaireCellView *cell = [tableView dequeueReusableCellWithIdentifier:acteCell];
if (cell == nil) {
cell = [[ActeSommaireCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:acteCell];
}
WS_WM_ActeDossier_V2 *currentActe = [dossier.LISTE_ACTE objectAtIndex:(indexPath.row) ];
cell.lblActe.text = currentActe.LB_ACTE;
cell.lblDatePresation.text = [dateFormatter stringFromDate:currentActe.DT_ACTE];
return cell;
}
return nil;
}
Les données sont récupérées comme suit :
- (void)donnerListeActesDossier_V2FinishWithResults:(WS_WTActeDossier_V2 *)wtActeDossierV2 {
NSString *msgErreur = [GestionErreur verifierCodeErreur:wtActeDossierV2];
if (msgErreur.length > 0)
{
[GestionErreur afficherMessageErreurAvecTitre:titreAlertErreur avecMessage:msgErreur];
return;
}
else {
dossier = wtActeDossierV2;
[tableViewActes reloadData];
[tableViewReglements reloadData];
}
}
Ce controller est ensuite ajouter dynamiquement au contenu d’une cellule d’un TableView d’un autre controller « RechercheDossiersViewController » dans la fonction « cellForRowAtIndexPath » :
static NSString *CellIdentifier = @"DetailDossierCell";
DetailDossierRembouressementBeneficiaireCellView* cell = [self.tView dequeueReusableCellWithIdentifier:CellIdentifier];
DetailsDossierViewController* detailController = [[DetailsDossierViewController alloc] init];
[self addChildViewController:detailController];
detailController.view.bounds = cell.contentView.bounds;
[cell.contentView addSubview:detailController.view];
[detailController didMoveToParentViewController:self];
SMPrestation *prest = [[SMPrestation alloc] init];
[prest donnerListeActesDossier_V2:detailController idMutuelle:[GlobalsObject sharedInstance].idMutuelle syDossierMut:dossier.SY_DOSSIER_MUT];
return cell;
Le controller « DetailDossierViewController » est bien déclenché pour récupérer les données mais tous les outlet du controller sont « Nil », comme s’il manquait une instanciation.
La méthode « cellForRowAtIndexPath » n’est jamais appelée et donc ma liste ne se construit
pas…
Je pense qu’il y a un câblage mal fait quelque part mais j’avoue que je me perds un peu…
En espérant que quelqu’un puisse m’aider.
Cordialement,