IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Appli Iphone Objective C - Données Table View


Sujet :

Objective-C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Appli Iphone Objective C - Données Table View
    Salut à toutes et à tous,

    Voilà depuis quelques temps je m'entraîne au développement en Objective-C pour réaliser des applis iphone à l'avenir.


    Je vous explique ce que j'ai fait. Je souhaite réalisé une petite appli de recherche (pour m'entraîner).

    Donc au lancement j'arrive sur une Table View avec une liste de cellules, je peux descendre le long de la liste ou effectuer une recherche.

    Quand on clique sur une cellule on arrive sur une vue détaillée avec une image(UIImage) et un texte(Label) (pour commencer..)

    J'utilises toutes les fonctions liées au table view et aux segue : -(void)prepareForSegue, cellForRowAtIndexPath, numberOfRowsInSection, textDidChange

    Jusque là tout fonctionne.

    Je voudrai que selon la cellule choisie, le texte et l'image de la vue détail soient différents. Si on clique sur la cellule A, cela affiche un texte A dans le Label et cela importe une image A dans l'UIImage. Et si on sélectionne la cellule B, on ait un Texte B et une image B (Images et textes qui seront dans les ressources de l'applications).

    La solution que j'ai trouvé pour le moment est la suivante : j'utilise la méthode prepareForSegue pour le passage à la vue détaillée quand on sélectionne une des cellules en passant le texte de la cellule dans une variable :
    méthode prepareForSegue dans la classe MasterViewController :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if([[segue identifier] isEqualToString:@"detailSegue"])
        {
            NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
            DetailViewController *dvc = [segue destinationViewController];
            dvc.texteAAfficher = [NSString stringWithFormat:@"%@", [tableauTotal objectAtIndex:selectedIndex]];
        }
    }
    Et pour la vue détail (classe DetailViewController), j'arrive à changer le texte et les images selon la cellule choisie en testant le nom de la variable passée par le prepareForSegue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	// Do any additional setup after loading the view, typically from a nib.
        [self configureView];
        //_donneeRecue.text = _texteAAfficher;
        if([_texteAAfficher isEqualToString:@"Abeille"]) {
            _donneeRecue.text = @"blablabla sur les Abeilles";
        }
        else if ([_texteAAfficher isEqualToString:@"Guêpes"]) {
            _donneeRecue.text = @"blablabla sur les Guêpes";
        }
         //  ETC ......
    }
    Je pense que vous comprendrez facilement ce que je fais.

    Tout d'abord cette méthode vous semble t'elle la bonne pour faire ce que je fais ? s'il vous plait

    MON PROBLEME :

    J'ai décidé d'améliorer l'application comme un vrai dictionnaire par exemple. Ce qui fait plusieurs Labels de textes et plusieurs images par vues. J'utiliserai la même méthode avec les < if, else if ... >

    Seulement, j'ai deux questions : dans mon exemple je rempli le texte avec un @"....", mais c'était pour tester. Maintenant puis-je importer des fichiers .txt comme je le fais pour les UIImages (en utilisant des .jpg) dans les ressources de l'application ? s'il vous plait

    Et ces fichiers textes (de plusieurs lignes) et toutes ces images seront dans les ressources de l'application. Est-ce le meilleur moyen ? Ou dois-je utiliser une base de donnée ou autre ? s'il vous plait

    Merci d'avance à ce qui prendront le temps de me lire (désolé de la longueur du post) et je vous souhaite bonne journée.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Relance
    Personne ne peut m'aider ? J'ai toujours eu l'habitude d'au moins deux trois réponses par post...

    Besoin d'aides svp....

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Je ne connais pas les storyboards, mais si j'ai bien compris le truc, oui c'est la méthode prepareForSegue qui permet de passer des arguments entre les vues, à un identifiant près
    Prochain coup, renseignes toi sur les storyboards
    Oui la programmation iPhone est simple, mais il faut connaître les concepts

    Pour le fichier texte, le mettre dans tes ressources pas de problème
    Par contre pour l'utiliser, je ne sais pas.
    Il faut tester: chercher le fichier dans les ressources et faire un fopen
    Par contre, il faut voir si sur un iPhone cela marche

    Apple a un système pour les fichiers plist: ce sont des fichiers XML que tu récupères avec un NSDictionnary. Et il y a même l'écriture

    Sinon CoreData ou SQLite3

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Salut et merci de ta réponse !

    Effectivement c'est bien avec prepareForSegue que je passe une variable du table view à la vue détaillée. Après je remplis mes textes et images selon ce que vaut cette variable passée depuis la table view.

    Pour les fichiers textes, d'après ce que j'entend et ce qu'on me répond, la solution de les mettre dans les ressources est elle "bien" ?
    Je veux dire, si j'ai besoin de 50 fichiers textes différents (car j'ai 50 cellules dans mon table view donc 50 résultats possibles), n'y a t'il pas une meilleure solution?
    Je ne connais pas du tout Core Data , et SQLite m'avait paru assez compliqué.

    Les fichiers plist et XML j'y ai pensé. Mais je ne m'y connais pas trop également...

    Je redis ce que je veux exactement :

    J'ai 50 cellules dans le table view. Quand je sélectionne une cellule j'arrive sur une vue détail où j'y importe des données.

    Je veux donc une sorte de BDD avec une table possédant 50 "lignes"
    A chaque ligne j'ai : 1 nom, 1 texte long (de plusieurs lignes) et 1 image.

    Si je sélectionne telle Cellule dans le Table View, je teste de voir si le nom de cette celulle est égal à un des 50 champs "noms"
    Si c'est égal à l'un des noms, on remplit le texte de la vue détail avec le texte correspondant à ce nom (de la même ligne dans la BDD) et pareil pour l'image.

    Je cherche le meilleur et le plus simple moyen de faire cela, selon vos expérience, mes maigres connaissances en BDD / XML, car je sais qu'il y aurait plusieurs façons.
    Je précise que ce serait du local, pas de BDD sur internet ou quoi , TOUT en local.

    Et selon ce que vous me conseillez, pourriez-vous m'indiquer des tutos ou autre, car oui je pourrai chercher sur le net (ce que je fais depuis 2 semaines) mais la quantité d'infos est énorme, trop d'avis diffèrent etc..
    Tandis que ceux qui s'y connaissent ont généralement les bonnes ressources.

    Je remercie d'avance les futurs réponses,

    Cordialement,

    Fuot

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Regardes ici ma réponse

    Sinon je ne sais pas pourquoi tu veux faire compliquer.

    Lorsque tu cliques sur une cellule de ta Table View il y a une callback ou un block qui se déclenche: tu codes un gros switch des familles

  6. #6
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Je comprend pas ce que tu me dis là

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par foetus Voir le message
    Sinon je ne sais pas pourquoi tu veux faire compliquer.

    Lorsque tu cliques sur une cellule de ta Table View il y a une callback ou un block qui se déclenche: tu codes un gros switch des familles
    Ah je suis bête c'est encore plus simple que prévu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if([[segue identifier] isEqualToString:@"detailSegue"]) {
            NSlndexPath* indexPath = [self.tableView indexPathForSelectedRow];
     
            MyObject* object = [list_objects objectAtlndex:indexPath.row];
     
            [(DetailViewController*) [segue destinationViewController]  setDetailitem:object];
        }
    }
    Après il faut:
    • Coder la méthode setDetailitem dans le contrôleur de la vue détaillée.
    • Avoir un tableau de type NSArray avec tous ces objets. Ou alors faire une base de donnée ou du CoreData avec le numéro de ligne comme paramètre de requête.
    • Si on utilise un simple tableau, un objet dérivera de NSObject et aura comme attribut 3 NSString: 1 pour le nom, 1 pour le texte long et 1 pour le nom ou le chemin relatif de l'image.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Je comprend bien pour la méthode prepareForSegue.

    Dans le DetailViewController.m je code donc la méthode setDetailItem.

    Je m'en suis servis qu'une fois auparavant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    - (void)setDetailItem:(id)newDetailItem
    {
        if (_detailItem != newDetailItem) {
            _detailItem = newDetailItem;
     
            // Update the view.
            [self configureView];
        }
    }
    Mais je sais pas trop comment la modifié pour ce cas là...

    Après je choisi la technique du tableau simple :

    je le crée dans la méthode également ? ou dans le viewDidLoad ??

    et on crée un tableau des objets récupérés via setdetailitem ???

    Après je vois :

    chaque objet 3 attributs STRING : 1 nom, 1 texte et 1 cheminImage

    while (...)
    si objet.nom = cellule selectionée (isEqualToString)
    alors texte = objet.texte
    image = objet.cheminImage



    Merci de ton aide en tout cas, j'ai juste hate de finir le taf pour rentrer essayer cela !!!!

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par Fuotmad Voir le message
    Je comprend bien pour la méthode prepareForSegue.

    Dans le DetailViewController.m je code donc la méthode setDetailItem.

    Je m'en suis servis qu'une fois auparavant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    - (void)setDetailItem:(id)newDetailItem
    {
        if (_detailItem != newDetailItem) {
            _detailItem = newDetailItem;
     
            // Update the view.
            [self configureView];
        }
    }
    Mais je sais pas trop comment la modifié pour ce cas là...
    J'ai regardé vite fait un livre pour prendre cet exemple. Et avec une petite recherche Google, on trouve la solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @property (XXX, XXX) MyObject* detailItem;
    Après il faut faire attention au recopie des attributs, etc..
    Encapsulating Data

    Après tu peux faire un code moins "moderne" avec juste un attribut pointeur. De toute façon, ce pointeur ne sert qu'à récupérer une adresse.
    À moins que tu veuilles une recopie de ton objet

    Citation Envoyé par Fuotmad Voir le message
    Après je choisi la technique du tableau simple :

    je le crée dans la méthode également ? ou dans le viewDidLoad ??
    1. Dans le AppDelegate
    2. Dans un singleton, initialisé ... dans le AppDelegate
    3. En lazy quelque part...

    L'avantage du singleton, c'est que que tu n'as pas besoin de passer pas l'attribut delegate (<- pas forcément le bon nom) de ton contrôleur avec un cast.

    Et le mieux, c'est que le tableau doit être détruit et créer à chaque fois que l'application entre ou sort du "fond de tâche" (à moins que cela prenne du temps à voir )
    Tout se passe dans le AppDelegate (ou ailleurs si tu le juges nécessaire).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        list_objects = [[NSMutableArray alloc] init];
     
        MyObject* tmpObject = nil;
     
        tmpObject = [[MyObject alloc] initObjectWithName:@"CHRISTOPHE COLOMB" andID:10];
        [list_objects addObject:tmpObject ];
        [tmpObject release];
     
        tmpObject = [[MyObject alloc] initObjectWithName:@"CHRISTOPHE COLOMB" andID:9];
        [list_objects addObject:tmpObject ];
        [tmpObject release];
        ....

    Citation Envoyé par Fuotmad Voir le message
    et on crée un tableau des objets récupérés via setdetailitem ???
    Non ce code c'est un peu n'importe quoi. Si on utilise un tableau (et non pas une base de donnée), il y a un tableau qui est en mémoire.
    Si tu le mets dans un singleton, tu peux passer qu'un index de tableau (le numéro de la ligne), au lieu d'un pointeur.
    Par contre avec une base de données tu es bien obligé de créer un objet avec les informations récupérées.
    Surtout, il faut faire attention à la recopie des attributs, ou peut-être c'est ce que tu veux.


    Citation Envoyé par Fuotmad Voir le message
    chaque objet 3 attributs STRING : 1 nom, 1 texte et 1 cheminImage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (...) 
        si objet.nom = cellule selectionée    (isEqualToString) 
        alors texte = objet.texte
            image = objet.cheminImage
    Si ton texte est trop long, tu peux faire une fonction, mais il faut faire attention au retour: autoreleasé ou pas versus weak/ strong avec ARC
    Et donc tes objets n'auraient plus que 2 NSStrings. Et c'est ton contrôleur qui garde l'index du tableau.
    Un bout de code en version sale, avec mon gros switch des familles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -(NSString) get_text:(int) index {
        switch(index) {
        case 1:
                return @"";
                break;
        case 2:
                return @"";
                break;
        case 3:
                return @"";
                break;
        }
    }
    Exemple de singleton dans ma réponse, partie 2

    Et tout ceci, juste pour te mettre le pied à l'étrier avant SQLite3 ou CoreData
    Je te le redonne intégration Base de Données

Discussions similaires

  1. [iOS 3.x] Utiliser des données d'une base MySQL dans une appli Iphone
    Par Thomas.NET dans le forum Objective-C
    Réponses: 3
    Dernier message: 16/04/2010, 11h13
  2. Exportation données tables
    Par JmL40 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 14/06/2007, 00h34
  3. Transfert de données table access sous excel
    Par lg022 dans le forum Access
    Réponses: 15
    Dernier message: 15/03/2007, 16h30
  4. Réponses: 3
    Dernier message: 04/07/2006, 17h07
  5. [débutant] problème affichage données table ds TDBGrid
    Par lidouka dans le forum Composants VCL
    Réponses: 1
    Dernier message: 16/12/2005, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo