[Résolu] Passer des données entre des vues : prepareforSegue

Am_MeAm_Me Membre
septembre 2014 modifié dans API UIKit #1

Bonjour,


 


Voilà  je pense que mon problème doit être mondialement connu mais je n'ai toujours pas trouvé de solution viable.


 


Imaginez 2 vues dans une application : les deux ayant des UITableView.


1) La première vue (Home/Accueil) sert à  afficher les flux RSS favori (mais juste le lien genre www.rss.cocoa.fr) d'un utilisateur.


2) La seconde vue permet de chercher et choisir d'ajouter d'autres flux en favori.


 


En résumé : donc la seconde vue a une NSArray *favoriNouveaux;


J'aimerai passer cette Array ,quand je clique sur un bouton, dans la liste des favorisAncien (dans Home) et la mettre à  jour


 


J'en viens donc à  prepareforSegue : 



- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@addFavorites]) {
ViewController *destViewController = segue.destinationViewController;
[destViewController.newFavorite addObjectsFromArray:favorites];
}
}

Dans HomeViewController.h et je n'arrive pas à  @synthetisize cette variable



@property (strong,nonatomic) NSMutableArray *newFavorite;

Actuellement j'ai, à  partir du storyboard, donné un nom au segue du bouton retour


Mais voilà  je bloque. Le code ci-dessus ne marche pas bien entendu et ne compile même pas


 


 


Ma Question


Y a t-il un moyen plus optimisé, plus propre pour faire passer un objet (tel qu'une NSMutableArray, NSArray) d'une vue à  une autre (api iOS 7+) ?


Et si c'est l'unique solution comment dois-je procéder ?


 


PS : Si vous voulez des précisions dans le code je les mettrais


Mots clés:

Réponses

  • LarmeLarme Membre
    septembre 2014 modifié #2

    ça ne compile pas ?


    Pourquoi ? Quel message d'erreur ?


     


    Sinon, c'est le moyen de passer des infos d'un VC à  un autre, avec des segues. Avant, sans le SB, c'était un peu différent, mais bon...


  • Am_MeAm_Me Membre
    septembre 2014 modifié #3

    Errata au dessus c'est pas une Array mais MutableArray


    Alors le message d'erreur est : 



    error: property's synthesized getter follows Cocoa naming convention for returning 'owned' objects
    In file included from BlablaPath/Blabla/Blabla/ViewController.m:9:
    BlablaPath/Blabla/Blabla/ViewController.h:27:46: note: property declared here
    @property (strong,nonatomic) NSMutableArray *newFavorite;
    ^
    1 error generated.

    Et j'ai mis à  jour mon post ( désolé ) pour détailler le problème aussi.


  • Pourquoi tu n'utilises pas plutôt un NSArray au lieu d'un NSMutableArray ? Dans ton cas actuel il ne peut pas contenir les données que tu lui passe si il n'est pas initialisé auparavant.


     


    Sinon j'ai pas bien compris ce que tu essayes de faire. Ton but est-il de passer des valeurs d'une vue parent à  une vue fils ou bien passer des données à  une vue parent à  partir d'une vue fils ? Si tu veux transférer des informations à  l'aide d'un bouton retour j'imagine que c'est le deuxième cas qui t'intéresse. Dans ce cas précis l'idéal ou du moins le plus conseillé c'est d'utiliser les delegates.


  • Joanna CarterJoanna Carter Membre, Modérateur
    septembre 2014 modifié #5

    Il n'est pas nécessaire de synthétiser le propriétés, sauf si tu veux avoir les effets secondaires.


     


    Côté passage d'un NSMutableArray, Il ne faut qu'ajouter une propriété de type NSMutableArray sur le destination ou mieux, si tu ne veux pas modifier le contenu, NSArray


  • Am_MeAm_Me Membre
    septembre 2014 modifié #6

    C'est à  dire les effets secondaires ?


     


    Bah j'ai ça actuellement 



    @property NSMutableArray *newFavorite;

    Mais toujours la même erreur

  • Am_MeAm_Me Membre
    septembre 2014 modifié #7

    Voilà  une image : pareille quand j'essaie de la synthétiser ... :/ 


  • Am_MeAm_Me Membre
    septembre 2014 modifié #8

    Bon au final j'ai compris l'erreur : en gros ma variable commence par "new" et ce n'est pas acceptable par le compilateur d'après certains forum. http://stackoverflow.com/questions/6327448/semantic-issue-propertys-synthesized-getter-follows-cocoa-naming-convention-fo


     


    Unacceptable Object Names


    newButton


    newLabel


    newTitle


    Acceptable Object Names


    _newButton


    mewLabel


    neueTitle


     


     


    Je me penche sur le code et je reviens vers vous. 


     


    PS : Ah oui quels sont les effets secondaires ? du @synthesize


     


    _____________________


     


    MAJ :


     


    Bon je me suis penché sur le code mais quand je regarde la taille de ma theNewFavorite (MutableArray) et bah elle est à  0. Sachant que j'ai regardé sa taille à  partir de viewDidLoad et viewWillAppear


     


     


    Pourtant je lui ai demandé de la remplir avec les objets d'une autre Array qui elle est bien remplie 



    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@addFavorites]) {
    ViewController *destViewController = segue.destinationViewController;

    NSLog(@favorites contient %ld,favorites.count);

    [destViewController.theNewFavorite addObjectsFromArray:favorites];
    }
    }

  • Je pense avoir résolu mon problème il me manquait l'allocation mémoire 



    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@addFavorites]) {
    ViewController *destViewController = segue.destinationViewController;



    destViewController.theNewFavorite = [[NSMutableArray alloc] init];

    [destViewController.theNewFavorite addObjectsFromArray:favorites];



    }
  • AliGatorAliGator Membre, Modérateur

    Dans ton cas actuel il ne peut pas contenir les données que tu lui passe si il n'est pas initialisé auparavant.



  •  



    Dans ton cas actuel il ne peut pas contenir les données que tu lui passe si il n'est pas initialisé auparavant.



     




     


    Je suis aveugle :o   je devrais aller me reposer ....  : Merci @Magiic et Aligator 

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