viewDidLoad appelé deux fois

AlexandreAlexandre Membre
septembre 2014 modifié dans API UIKit #1

Bonjour,


 


j'ai un problème étrange, j'ai un segue vers une tableView qui me charge deux foix la tableView.


Quelqu'un a déjà  rencontré ce genre de chose ?


 


Mon code :



@implementation AAListViewController

@synthesize navController;

-(id)initWithNavigationController:(UINavigationController *)navigationController{
self = [super init];
if (self){
navController = navigationController;
}
return self;
}

-(NSMutableArray *)myList
{
if (!_myList) {
_myList = [[NSMutableArray alloc] init];
}
return _myList;
}

-(NSMutableArray *)friendsPicked {
if (!_selectedFriends) {
_selectedFriends = [[NSMutableArray alloc] init];
}

return _selectedFriends;
}

-(id)init {
return [self initWithNavigationController:nil];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];

self.textView.text = nil;
self.titleLabel.delegate = self;

// Do any additional setup after loading the view.

}


- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (IBAction)saveBarButtonPressed:(UIBarButtonItem *)sender {


NSLog(@selection finale : %@", self.selectedFriends);

self.theNewList = [PFObject objectWithClassName:AAListClassKey];

[self.theNewList setObject:self.textView.text forKey:AAListTextKey];
[self.theNewList setObject:self.titleLabel.text forKey:AAListTitleKey];
[self.theNewList setObject:[PFUser currentUser] forKey:AAListUserKey];


[self.theNewList saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (!error) {
[[NSNotificationCenter defaultCenter] postNotificationName:@refreshTable object:self];
[self dismissViewControllerAnimated:YES completion:nil];
}
}];
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[self.titleLabel resignFirstResponder];
return YES;
}


#pragma mark - Segue

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.destinationViewController isKindOfClass:[AAFBFriendPickerTableViewController class]]) {
AAFBFriendPickerTableViewController *pickerSegue = segue.destinationViewController;
pickerSegue.delegate = self;
}
}


- (IBAction)shareWithButtonPressed:(UIButton *)sender {
[self performSegueWithIdentifier:@listToFriendPickSegue sender:nil];
}

#pragma mark - Delegate

-(void)didPickFriends:(NSMutableArray *)friendsPicked{

[self.selectedFriends addObjectsFromArray:friendsPicked];


}




@implementation AAFBFriendPickerTableViewController

-(NSMutableArray *)selectedFriends{
if (!_selectedFriends) {
_selectedFriends = [[NSMutableArray alloc] init];
}
return _selectedFriends;
}

- (void)viewDidLoad {
[super viewDidLoad];

// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;

// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;

self.tableView.delegate = self;
self.tableView.dataSource = self;
[self AvailableFriends];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
NSLog(@nombre d'amis : %lu, [self.friendsArray count]);
return [self.friendsArray count];


}

-(void)AvailableFriends {
PFQuery *query = [PFQuery queryWithClassName:@Activity];
[query whereKey:@fromUser equalTo:[PFUser currentUser]];
[query includeKey:@toUser];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
[self.friendsArray removeAllObjects];
self.friendsArray = [objects mutableCopy];
NSLog(@Amis présent dans friendArray : %@", self.friendsArray);
[self.tableView reloadData];
}];

}



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

static NSString *CellIndetifier = @friendCell;

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

PFObject *friend = [self.friendsArray objectAtIndex:indexPath.row];
PFUser *friendInTable = [friend objectForKey:@toUser];
cell.textLabel.text = friendInTable[@name];

if ([self.selectedFriends containsObject:[self.friendsArray objectAtIndex:indexPath.row]]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType == UITableViewCellAccessoryNone) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[self.selectedFriends addObject:[self.friendsArray objectAtIndex:indexPath.row]];
NSLog(@%@", self.selectedFriends);
}
else {
cell.accessoryType = UITableViewCellAccessoryNone;
[self.selectedFriends removeObject:[self.friendsArray objectAtIndex:indexPath.row]];
NSLog(@%@", self.selectedFriends);

}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

#pragma mark - Action Buttons

- (IBAction)cancelButtonPressed:(UIBarButtonItem *)sender {
[self.navigationController popToRootViewControllerAnimated:YES];
}
- (IBAction)shareButtonPressed:(UIBarButtonItem *)sender {
[self.delegate didPickFriends:self.selectedFriends];
[self.navigationController popViewControllerAnimated:YES];
}


Merci :)


Réponses

  • Quel viewDidLoad: est appelé deux fois ?


    Je vois que tu as un [super viewDidLoad]; sa classe mère, c'est juste UIViewController, où tu as un truc d'héritage qui pourrait poser problème ?


  • Le friendPickerViewController


     


    Je vais changer ça !


  • Même en retirant le [super viewDidLoad] la vue friendPickerTableViewController est appelée deux fois... 


  • As-tu checké si c'est le même objet qui est loadé deux fois ?



    - (void)viewDidLoad {
    NSLog(@Il s'agit de cet objet : %@", self)

    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self AvailableFriends];
    }

    et compare les logs.


  • Autre idée : est-ce que par hasard tu appelles explicitement viewDidLoad quelque part ?


  • quand je check avec NSLog(@Il s'agit de cet objet : %@", self)


    la console ne me retourne rien :/


  • CéroceCéroce Membre, Modérateur

    C'est que la fonction NSLog() n'est pas appelée. Arrêtez de déboguer avec NSLog() ! Non vraiment, c'est pas du php, il y a un vrai débogueur, utilisez-le ! 


  • +1 Céroce.


     


    Je ne comprends pas ce qu'est AAListViewController ni pourquoi tu synthetize le navigationController. Possible que tu ai deux instances de AAFBFriendPickerTableViewController ce qui expliquerait ton appel en trop de viewDidLoad.


  • Ok ceroce, j'en ai profité pour voir comment fonctionne le débuter... j'aurai du faire ça depuis longtemps :/


     


    Donc oui après avoir regardé ce qu'il se passe mon segue est déclenché deux fois.


  • J'ai conseillé d'utiliser NSLog() pour deux raisons


     


    - d'une part, c'est plus facile à  expliquer que le debugger


    - d'autre part, cela permet de vérifier facilement si c'étaient les mêmes instances qui lançaient le - viewDidLoad.


     


     


    Ensuite, c'est clair qu'utiliser le debugger est 1000 fois plus puissant que NSLog.


  • C'est ce que je me suis dit aussi depuis le début, il doit y avoir deux instances de AAFBFriendPickerTableViewController.

     


    Cependant j'ai bien regardé même fait une recherche, il n'y a bien qu'une seule instance de cette classe.


  • AliGatorAliGator Membre, Modérateur
    Et tu n'aurais pas connecté ton Segue 2 fois dans ton Storyboard ?

    Ca m'est arrivé par exemple de connecter une IBAction à  un bouton 2 fois et du coup il me la déclenchait en double (après tout derrière c'est un "addTarget:action:forControlEvent:"). Pour les Segue c'est sans doute pareil ?
  • Je viens de recréer mon segue du coup après avoir bien vérifié qu'il n'était connecté qu'un fois dans le storyboard... toujours le même soucis je m'arrache les cheveux :x


  • Bon j'ai rajouter une condition pour le segue, renommé mon fichier et ma vue rien à  faire le segue se déclenche toujours deux fois... 


  • Dernier post... j'ai fini par caler le bouton en Bar button item et là  plus de soucis... 


    Le problème venait donc du bouton "normal" au sein de la vue... j'ai testé en en rajoutant un deuxième envoyant sur un vue bidon avec un label il me faisait la même chose en loadant deux fois la vue.


     


    Si quelqu'un à  une idée je suis preneur pour le moment je vais rester comme ça :/


  • Pourrait tu nous envoyer un peu de screenshot de ton storyboard et montre nous comment tu procèdes avec le segue (toujours avec le storyboard + Clique droit sur ton bouton pour voir s'il n'est pas relié à  une autre méthode ... ). Cache/Remplace les éléments que tu juges "secret"


  • AlexandreAlexandre Membre
    octobre 2014 modifié #18

    Pour faire plus simple j'ai upload mon code :


    http://ge.tt/7o3zl002/v/0?c


     


    Il n'y a rien de secret c'est une appli que je fais pour m'entrainer à  coder :)


    J'ai juste délai les clés Facebook et parse.


     


    dans la vue AAListViewController tout en bas j'ai rajouté un bouton qui mène à  une autre vue simple avec un label. Quand on clic dessus elle charge deux fois.


     


    Merci pour votre aide en tout cas :)


  • Am_MeAm_Me Membre
    octobre 2014 modifié #19

    Alors ça va être un peu chaud la pour tester (car j'ai mis "pod setup" et "pod install" pour ceux qui n'ont pas pod et faut rajouter les frameword c'est chaud bref) mais je pense avoir déjà  trouvé une voie de solution.


     


    Voilà  dans ton storyboard

  • Détérage de topique mais ça peu peut être aider plus tard.


     


    En effet mon segue partait du bouton et je redemandai l'exécution d'un segue à  l'appui du bouton dans mon code ce qui faisait que le segue s'effectuait deux fois à  la suite.


     


    Une habitude que j'ai maintenant appris à  ne plus prendre, je crée mes segue de vue à  vue et les déclenche au sein du code directement :)


     


    Pour info j'ai une petite app qui devrait sortir bientôt, un dernier bug à  régler et je la soumet à  l'app store en tout cas merci pour votre aide !


  • Oublie pas de changer le titre de ton post en résolu :)


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