passer des données via un uibutton

Bonjour,


Je bosse sur une appli "sociale" avec le sdk de Parse.com. J'essaye de faire un système de following/followers comme sur Twitter ou Instagram.


 


Sur la page d'un utilisateur je souhaiterais que lorsque l'on appuie sur le bouton "followers", tous les users qui suivent le currentUser s'affichent dans une uitableview.


 


J'aurais besoin de votre aide pour faire passer la data du user par cet uibutton afin de pouvoir retrouver ses followers sur le second controller. 


 


je pensais utiliser un prepareforsegue mais l'appli plante, ça ne passe pas. 


Voici mon code:


 


sur le premier controller:


file.h


...


 


@class PFUser;


 


@interface friendListProfileViewController : PFQueryTableViewController


 


@property (nonatomic, strong) PFUser *user;


 


@property (strong, nonatomic) IBOutlet UIButton *followersButton;


 


 


@end


 

file.m


...


 


@interface friendListProfileViewController ()


 


@end


 


@implementation friendListProfileViewController


 


 


...


 


 


- (IBAction)followersButton:(UIButton*)sender {


    


}


 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {


  


    if ([[segue identifier] isEqualToString:@showFollowers]) {


     


        


        PFUser *user = _user;


        


     


        userFollowersTableViewController *svc = [segue destinationViewController];


        svc.user = user;


 


        


    }


 


 


}


@end


 

Comme vous pouvez le voir j'ai un IBAction qui ne sert à  rien, je ne sais pas comment l'associer avec le prepareforsegue (du moins est-ce utile de le faire?)


 


sur le second controller (où je souhaite faire apparaà®tre la liste des noms des utilisateurs qui suivent le user) voici mon code:


 


.h


...


 


@class PFUser;


@interface userFollowersTableViewController : UITableViewController


@property (nonatomic, strong) PFUser *user;


 


@end


 

.m


 


...


 


@interface userFollowersTableViewController ()


 


 


@property (nonatomic, strong) NSMutableArray *followers;


 


@end


 


@implementation userFollowersTableViewController


 


 


- (void)viewDidLoad


{


    [super viewDidLoad];


    


    


    _followers = [[NSMutableArray alloc] init];


    [self getUsernames];


}


 


 


-(void)getUsernames {


    


    PFUser *followedUser = [PFUser user];


    PFQuery *query = [PFQuery queryWithClassName:@followRelationship];


    [query whereKey:@toUser equalTo:followedUser];


    [query includeKey:@fromUser];


   


    


    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {


        if (!error) {


            for (PFObject *object in objects) {


                PFUser *user = [object objectForKey:@fromUser];


                [self.followers addObject:user];


            }


            [self.tableView reloadData];


        }


    }];


}


 


#pragma mark - Table view data source


 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView


{


    // Return the number of sections.


    return 1;


}


 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


{


    // Return the number of rows in the section.


    return [self.followers count];


}


 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


{


    static NSString *CellIdentifier = @Cell;


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


    


 


    PFUser *user = [self.followers objectAtIndex:indexPath.row];


    NSString *username = user.username;


    cell.textLabel.text = username;


    


    return cell;


}


 


@end


 

qu'en pensez-vous ? il me semble que le prepareforsegue du premier controller est incorrect?

(excusez mon ignorance je débute!)

n'hésitez pas à  me demander des précisions, merci par avance!

 

 


Réponses

  • samirsamir Membre
    avril 2014 modifié #2

    Salut,


     


    Je ne sais si je peux t'aider, j'ai pas encore regarder comment ça marche les stroryboad :), mais :


     


    Je pense que ça te suffit de récupérer ton controller dans la méthode followersButton: sans passer par le prépareForSegue:



    - (IBAction)followersButton:(UISender)sender {
    userFollowersTableViewController *userFollowersVC =
    [[UIStoryboard storyboardWithName:....] instantiateViewControllerWithIdentifier:@userFollowersTableViewControllerIdentif ier];
    userFollowersVC.user =....
    ....
    }

  • Salut,


    1-Dans le doute vérifie dans ton storyboard le nom de la segue.


     


    2-Si ton IBAction ne sert pas ben ne la crée pas tout simplement :)


     


    3-Sur cette ligne : 



    userFollowersTableViewController *svc = [segue destinationViewController];

    tu devrais caster ton controller :



    userFollowersTableViewController *svc = (userFollowersTableViewController *)[segue destinationViewController];

    4- Vérifie que ton controller dans le storyboard est bien de type userFollowersTableViewController.


     


    Voilou ce  à  quoi je pense ^^


  • Bonjour,


    Bon c'est la misère ça plante toujours... Samir et Soldras merci malgré tout pour vos réponses.


    J'ai l'impression que quelque chose ne va pas dans mon storyboard


    je fais le récap:


     


    - j'ai bien nommé le second controller dans le storyboard "userFollowersTableViewController"


    - j'ai bien indiqué dans l'identifier du segue "showFollower"


    - J'ai connecté le bouton au IBOutlet mentionné dans le header file


    - j'ai enlevé le IBAction qui ne servait à  rien


    - j'ai casté le controller comme conseillé par Soldras :


    userFollowersTableViewController *svc = (userFollowersTableViewController *)[segue destinationViewController];


     


    mon segue est de type "push" (un navigation controller est relié au premier controller), 


    pensez-vous que le problème puisse venir de là  ? Faut il ajouter quelque chose dans ce cas là  ?

  • Tu pourrais donner plus détails sur le "plantage". ça plante quand exactement ?

    Tu as les logs de l'erreur ?
  • ça plante lorsque j'appuie sur le bouton, xcode fait alors apparaà®tre la classe appdelegate avec un signal SIGABRT


    à  la ligne   return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));


    dans la debug area il est indiqué: libc++abi.dylib: terminating with uncaught exception of type NSException


    (lldb)

  • Ouki,


    tu as virer l'IBAction mais tu l'as supprimé dans le storyboard aussi ?


  • LarmeLarme Membre
    avril 2014 modifié #8

    Et on peut avoir le message entier de la NSException ? En général, y'a un message explicite (la ligne du dessus ou du dessous, j'sais jamais)


     


    Sur le IBAction, j'aurais fait:



    [self performSegueWithIdentifier:@showFollowers sender:nil];

    à  moins que cela ne soit fait via InterfaceBuilder, j'ai pas trop suivi ce truc là .


     


    Tu pourrais utiliser la balise code sinon ? Surtout quand ce sont de gros pavés de code ?


  • je viens de faire le ménage sur l'inspecteur de connections


     


    j'ai uniquement connectés : le segue et l'iboutlet 


     


    quand je compile et appuie sur le bouton j'ai toujours le même message dans la debug area, par contre le signe sigabrt n'apparaà®t plus sur la classe appdelegate mais sur le second controller "userFollowersTableViewController"


    au niveau de la ligne :   [self getUsernames];

  • voici le message entier


     


    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to save an object with a new, unsaved child.'


     

  • De ce que j'ai vu, c'est une erreur propre à  parse (vu que les premiers résultats de la recherche m'amènent sur leur site)


    Du coup, sans en avoir fait, c'est plus dur.

    Je te conseille d'aller voir ce qui pourrait provoquer cette erreur sur le net.


  • Tu avais des problèmes ton storyboard mais la ça vient de parse comme dit Larme...


    Du coup je peux pas t'aider non plus.


  • effectivement je vais chercher de ce coté là ... 


     


    en tout cas un grand merci à  tous de m'avoir mis sur la voie ! 


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