[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:


 


Screen%20Shot%202013-10-12%20at%206.07.1


 


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.


Mots clés:

Réponses

  • KubernanKubernan Membre
    octobre 2013 modifié #2

    Bonjour,


     




    Bonjour,


    Je suis tout nouveau dans le dev. sur iPhone et je me retrouve face à  un soucis.




     


    Merci de te présenter dans la section adéquate afin qu'on puisse en savoir plus sur ton background.


     


     




    Cependant quand je choisi un élément dans la table, la vue détail ne s'affihe pas.




     


    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 : 



    if (cell == nil)
    cell = [[UITableViewCell alloc]
    initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];

    est inutile vu qu'avec Storyboard, ta cell n'est jamais à  nil (principe d'automatic cell loading).


  • DoudouDoudou Membre
    octobre 2013 modifié #3

    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:



    - (void)viewDidLoad
    {
    [super viewDidLoad];
    [self configureView];
    _donneeRecue.text = _texteAAfficher;

    NSLog(@The code runs through here!);
    }

    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 ?


  • DoudouDoudou Membre
    octobre 2013 modifié #5

    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é :/


  • KubernanKubernan Membre
    octobre 2013 modifié #6

    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



    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    [self performSegueWithIdentifier:@detailSegue sender:nil];
    }

    Peut-être as tu une explication du pourquoi je dois déclencher manuellement ceci?


     


    En tout cas un grand merci à  toi :)


  • KubernanKubernan Membre
    octobre 2013 modifié #8

    ç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 :D.


    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:



    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    [self performSegueWithIdentifier:@LeNomDeTaSegue sender:self];
    }
  • Et je vois que j'ai sortie la reponse qui est 4 ligne au dessus ....


     


     


    Va se pendre...




  •  


    Question : ta segue entre la tableView et la detailView est bien mise sur la cellule ? Pas sur la table ?


     




     


    J'y avais pensé aussi mais sur la première capture écran on voit que c'est bien la cell qui a le segue...



  • 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....



  • 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 ?


  • DoudouDoudou Membre
    octobre 2013 modifié #18

    Alors enfaite j'ai juste rempli le champ Identifier ici:


     


  • SoldrasSoldras Membre
    octobre 2013 modifié #19

    Ben après tu remplis ton texte avec



    cell.textLabel.text = @Ton titre de Cellule;
    cell.detailTextLabel.text = @Ton sous titre

    tu as bien fait ça ?




  • Alors enfaite j'ai juste rempli le champ Identifier ici:


     


    attachicon.gifScreen Shot 2013-10-28 at 09.53.15.png


     


    Et j'ai remplacé dans mon code le MyIdentifier par NewsCellIdentifier.


    Ce qui est logique car quand je créer une nouvelle cellule dans le code, ici



    static NSString *MyIdentifier = @MyIdentifier;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    Mon MyIdentifier n'existe pas. Il créer donc une cellule à  partir de rien, donc sans segue et sans style.




    Je viens de capter un truc tu as bien fait attention que tu as pas remplacer ton identifier dans le code ???? 



  • 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 :).




     


    Si tu avais enlevé le petit bout de code que je t'avais indiqué :



    if (cell == nil)
    cell = [[UITableViewCell alloc]
    initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];

    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 :)


Connectez-vous ou Inscrivez-vous pour répondre.