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;
file.m
...
@interface friendListProfileViewController ()
@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;
}
}
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;
.m
...
@interface userFollowersTableViewController ()
@property (nonatomic, strong) NSMutableArray *followers;
@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;
}
Réponses
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:
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 :
tu devrais caster ton controller :
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 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 ?
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:
à 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 !