[iOS] TableView, le détail n'apparait pas
Bonjour,
Je suis tout nouveau dans le dev. sur iPhone et je me retrouve face à un soucis.
J'essaye donc banalement d'afficher une TableView avec une autre pour le détail. Cependant quand je choisi un élément dans la table, la vue détail ne s'affihe pas. Voici un aperçu de l'application:
J'ai aussi un NewsController pour la TableView
//
// NewsControllerViewController.h
// Studio
//
// Created by Edouard COMTET on 10/11/13.
// Copyright (c) 2013 Edouard COMTET. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "DetailViewController.h"
@interface NewsViewController : UITableViewController
{
NSMutableArray *maListe;
}
@property (strong, nonatomic) DetailViewController *detailViewController;
@end
//
// NewsControllerViewController.m
// Studio
//
// Created by Edouard COMTET on 10/11/13.
// Copyright (c) 2013 Edouard COMTET. All rights reserved.
//
#import "NewsViewController.h"
#import "DetailViewController.h"
@interface NewsViewController ()
@end
@implementation NewsViewController
- (void)viewDidLoad
{
[super viewDidLoad];
maListe = [NSMutableArray array];
[maListe addObject:@Paris];
[maListe addObject:@Lyon];
[maListe addObject:@Marseille];
[maListe addObject:@Toulouse];
[maListe addObject:@Nantes];
[maListe addObject:@Nice];
[maListe addObject:@Bordeaux];
[maListe addObject:@Montpellier];
[maListe addObject:@Rennes];
[maListe addObject:@Lille];
[maListe addObject:@Le Havre];
[maListe addObject:@Reims];
[maListe addObject:@Le Mans];
[maListe addObject:@Dijon];
[maListe addObject:@Grenoble];
[maListe addObject:@Brest]; self.navigationItem.title = @Grandes villes;
self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [maListe count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *MyIdentifier = @MyIdentifier;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
// Configuration de la cellule
NSString *cellValue = [maListe objectAtIndex:indexPath.row];
cell.textLabel.text = cellValue;
return cell;
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
printf("YOUPI");
//if([[segue identifier] isEqualToString:@detailSegue])
//{
// NSInteger selectedIndex = [[self.tableView
// indexPathForSelectedRow] row];
// DetailViewController *dvc = [segue destinationViewController]; dvc.texteAAfficher = [NSString stringWithFormat:@%@", [maListe objectAtIndex:selectedIndex]];
//}
}
@end
Et un DetailController pour la vue détail
//
// DetailViewController.h
// Studio
//
// Created by Edouard COMTET on 10/11/13.
// Copyright (c) 2013 Edouard COMTET. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController
@property (strong, nonatomic) id texteAAfficher;
@property (strong, nonatomic) id detailItem;
@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (weak, nonatomic) IBOutlet UILabel *donneeRecue;
@end
//
// DetailViewController.m
// Studio
//
// Created by Edouard COMTET on 10/11/13.
// Copyright (c) 2013 Edouard COMTET. All rights reserved.
//
#import "DetailViewController.h"
@interface DetailViewController ()
@end
@implementation DetailViewController
@synthesize texteAAfficher = _texteAAfficher;
@synthesize detailItem = _detailItem;
@synthesize detailDescriptionLabel = _detailDescriptionLabel;
@synthesize donneeRecue = _donneeRecue;
- (void)setDetailItem:(id)newDetailItem{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
// Update the view.
[self configureView]; }
}
- (void)configureView
{
// Update the user interface for the detail item.
if (self.detailItem) {
self.detailDescriptionLabel.text = [self.detailItem description]; }
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self configureView];
_donneeRecue.text = _texteAAfficher;
}
@end
Pour la petite info, le lien entre la Table et le détail est un Push de type StoryboardSegue.
Merci d'avance pour votre aide.
PS: je suis sous Xcode5 et avec iOS7.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bonjour,
Merci de te présenter dans la section adéquate afin qu'on puisse en savoir plus sur ton background.
Est-ce que tu as vérifié que le controller de ta vue détail était bien chargé ? (un NSLog() sur ton viewDidLoad suffira à avoir l'info). As-tu vérifié que dans ton Storyboard la classe de ta scene détail était bien associée à ton controller (voir dans l'inspecteur de ta scene) ?
p.s. la test suivant :
est inutile vu qu'avec Storyboard, ta cell n'est jamais à nil (principe d'automatic cell loading).
Merci de ta réponse Kubernan, j'espère m'en sortir . Pour la présentation, j'étais entrain de la faire mais depuis le train ça a coupé ^^.
Alors j'ai rajouté un petit NSLog dans le DetailViewController.h:
Mais tu as raison, celui n'apparait pas alors que la classe dans le Storyboard est la bonne comme en PJ.
Ton prepareForSegue:... de ton UITableViewController est-t-il bien appelé automatiquement ?
Alors justement, le printf("YOUPI") que tu peux voir dans le NewsController.m n'est jamais affiché. Donc non, je pense que le prepareForSegue n'est pas appelé
Des warnings à la compilation ? Un Product->Clean ? Ta sélection de cell fonctionne-t-elle au moins (ajoute un tableView:didSelectRowAtIndexPath: dans ton table view controller, vois s'il est appelé) ?. Sinon je sèche.
Alors après moule recherche grâce aux mot clef que tu m'as fournit, j'ai enfin trouvé. Il a fallu que je rajoute ce bout de code dans le NewsController.m
Peut-être as tu une explication du pourquoi je dois déclencher manuellement ceci?
En tout cas un grand merci à toi
ça ne me semble pas un comportement normal, je n'ai pas d'explication. Faudrait voir le projet.
Ok, bon ben merci quand même alors .
A bientôt sur le forum, merci
Question : ta segue entre la tableView et la detailView est bien mise sur la cellule ? Pas sur la table ?
Si tu la mise sur la table faut rajouter dans ton code:
Et je vois que j'ai sortie la reponse qui est 4 ligne au dessus ....
Va se pendre...
J'y avais pensé aussi mais sur la première capture écran on voit que c'est bien la cell qui a le segue...
Ben je me suis dis que c'était peut-être simplement parcequ'il la sélectionné sans faire exprés quand il a pris le screenshot....
Peut-être bien. Mystère à résoudre :-)
Non non, je confirme que ma relation est sur la cell et non sur la table, c'était le but en effet de la première screenshot .
Bonjour à tous,
Je me suis retrouvé face à nouveau problème: impossible d'utiliser le style Subtitle dans ma Cell. Je me suis donc qu'il y avait vraiment un problème avec ce que j'ai fait!!! Et oui: je n'ai pas mis d'identifier!!!
Tous mes problèmes sont donc résolus .
tu as fait quoi exactement ?
Alors enfaite j'ai juste rempli le champ Identifier ici:
Ben après tu remplis ton texte avec
tu as bien fait ça ?
Je viens de capter un truc tu as bien fait attention que tu as pas remplacer ton identifier dans le code ????
Si tu avais enlevé le petit bout de code que je t'avais indiqué :
Tu te serai rendu compte assez vite de ton problème. En effet, comme tu n'avais pas mis d'identifier sur la cell de ton storyboard, la phase de dequeue t'aurai renvoyé une cell à nil. Et ton programme aurait planté avec un message qui t'aurai mis sur la piste.
Oui, maintenant j'arrive bien à remplir tout correctement .
Pourquoi il ne faut pas le remplacer, au contraire, je dois remplacer MyIdentifier par NewsCellIdentifier, ce que j'ai fait
Merci Kubernan de ta réponse, je viens de relire et en effet, tu me l'avais proposé.
Je ne l'avais malheureusement pas compris à l'époque . Je serai plus attentif la prochaine fois