2012-06-10 5 views
1

J'ai une page 'Créer un nouvel événement' où l'utilisateur peut cliquer sur 'Retour' sur le UINavigationController ou sur 'Terminé' pour créer un nouvel événement. Les deux mènent à la même page après.Comment savoir si l'utilisateur a appuyé sur ou fait?

Si mon utilisateur appuie sur "Terminé", l'objet actuellement conservé sur le contrôleur est sauvegardé via saveChanges. Cependant, si l'utilisateur a décidé d'abandonner ceci même s'il édite, j'ai besoin de nettoyer les fichiers statiques générés par cet utilisateur pendant cette durée de vie de cet événement.

Mon seul problème est qu'il n'y a aucun moyen pour moi de différencier un utilisateur d'appuyer sur 'Terminé' ou 'Annuler'.

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    // If user has left this page by either pressing 'Done' or 'Cancel' 
    if (![[self.navigationController viewControllers] containsObject:self]) { 
     // If this event is NOT saved aka 'Cancel' is pressed. 
     if (![event isUpdated]) { 
      // It is important that we only delete videos associated when isNew. 
      if (isNew) { 
       NSURL *url = [self getMovieUrl:event.uuid]; 
       [self deleteMovieByUrlIfExists:url]; 
      } 
      self.event = nil; 
     } 
    } 
} 

- (IBAction)done:(id)sender { 
    [self.view endEditing:YES]; 
    if (isNew) { 
     event.eventType = eventTypeInput.text; 
     event.targetId= [NSNumber numberWithInt:[targetIdInput.text intValue]]; 
     event.game = game; 

     BOOL success = [[DataStore singletonInstance] saveChanges]; 
     if(success) { 
      NSLog(@"Success: Event %@ saved. hasVideo:%d", event.uuid, [event.hasVideo intValue]); 
      // TODO [newEvent upload]; 
      // Also upload the video if possible. 
     } 
    } 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

Le code ci-dessus ne fonctionne pas. Lorsque l'utilisateur appuie sur «Terminé», deleteMovieByUrlIfExists: l'URL est toujours appelée. Quelqu'un sait pourquoi?

====== Voici comment isNew est défini.

- (void)initWithEvent:(id)sender event:(Event *)ev { 
    isNew = !ev; 
    if (isNew) { 
     event = [[DataStore singletonInstance] createEvent];   
    } else { 
     event = ev; 
    } 
} 
+2

Avez-vous associé des fonctions de rappel distinctes pour les boutons fait et retour? – Saurabh

Répondre

0

Apparemment, [event isUpdated] et isNew ont toujours la même valeur quel que soit l'action que l'utilisateur prend. Définissez un drapeau (un BOOL ivar, par exemple) en done: et vérifiez la valeur du drapeau au viewWillDisappear:.

+0

En fait, isNew est défini par la fonction init et non par isUpdated. – disappearedng

0

vous devez créer un délégué pour votre contrôleur de vue, les délégués sont utilisés pour transférer des données basées sur des actions à d'autres contrôleurs de vue, je vous le conseil fortement pour en savoir plus sur les délégués, mais voici un simple instructions pour le faire

@protocol viewControllerDelegate <NSObject> 
@required 
//define the delegate methods 
-(void)backButtonPressed; 
-(void)doneButtonPressed:(id)sender 

@end 

@interface ViewContorller : xxx 
{ 
id <viewControllerDelegate> delegate; 
} 

maintenant dans la méthode d'action et après avoir terminé le traitement des données que vous écrivez cette ligne de code

- (IBAction)done:(id)sender { 
[delegate backButtonPressed:sender] 
} 

maintenant tous les contrôleurs de vue la mise en œuvre ce délégué sera être averti de cela, vous devez créer deux méthodes de déléguer un pour la ba Bouton ck et un autre pour le bouton Terminé

//in the parent view controller .h file add the delegate to the definition 
@interface MyViewController: UIViewController <viewControllerDelegate> 

//in the .m file implement the delegate methods 
-(void)backButtonPressed:(id)sender 
{ 
    //this method will get called when the back button is pressed 
} 
-(void)doneButtonPressed:(id)sender 
{ 
    //this method will get called when the done button is pressed 
} 
+0

Comment appuyer sur Retour sur UINavigationController déclencher backButtonPressed? – disappearedng

+0

mettre cette ligne de code à l'intérieur de la cible du bouton arrière ** [delegate backButtonPressed: expéditeur] ** indiquera à toutes les classes implémentant le que le bouton a été pressé – ahmad

+0

non ce n'est pas ce que je veux dire. Je veux dire ce qui déclenche backButtonPressed? Vous ne pouvez pas faire Ctrl-glisser le bouton de retour de UINavigationController à cette méthode FYI. – disappearedng

Questions connexes