2017-09-17 11 views
0

J'ai des problèmes à arrêter un indicateur d'activité d'une fonction dans mon délégué de l'application, je sais que la fonction est appelée, mais je ne reçois aucune erreur dans mon journal.stopAnimation indicateur d'activité du délégué de l'application

Je crée le activityIndicator dans mon signInViewController comme si

@IBAction func googleSignInButton(_ sender: Any) { 

    GIDSignIn.sharedInstance().uiDelegate = self 
    GIDSignIn.sharedInstance().signIn() 


    activityIndicator.center = self.view.center 
    activityIndicator.hidesWhenStopped = true 
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.white 
    view.addSubview(activityIndicator) 

    activityIndicator.startAnimating() 
    UIApplication.shared.beginIgnoringInteractionEvents() 


} 

après dans mon délégué app j'ai cette fonction,

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) { 

      print("this function is running") 
      SignInViewController().stopanimating() 

      // ... 
      if error != nil { 
       // ... 


       return 
      } 

Je sais cette fonction fonctionne bien comme il imprime la texte dans l'ect de journal. et appelle cette fonction de la SignInViewController

func stopanimating() { 
     print("stop animating function running") 
     DispatchQueue.main.async { 
      self.activityIndicator.stopAnimating() 
      UIApplication.shared.endIgnoringInteractionEvents() 
     } 
    } 

je sais maintenant cette fonction est en cours d'exécution car elle imprime également le texte prévu dans le journal et aussi les endIgnoringInteractionEvents ne fonctionne pas mais l'indicateur d'activité est toujours en cours d'exécution

im tout à fait nouveau à rapide mais j'avais eu des problèmes à manipuler des objets dans les viewcontrollers de mon appdelegate avant, est-ce possible?

Merci à l'avance

+0

assurez-vous d'abord que l'ordre d'exécution est à jour. si vous avez essayé de désactiver l'animation du délégué de votre délégué d'application de manière asynchrone. il pourrait être appelé avant l'animation de départ. Deuxièmement, je peux me tromper, mais on dirait que vous utilisez la classe et non une instance de votre contrôleur de vue lorsque vous essayez de désactiver l'animation. est-ce exprès? – nevgauker

Répondre

1

Quand vous faites:

SignInViewController().stopanimating() 

Ce que vous faites est la création d'une nouvelle SignInViewController et appelant la méthode sur elle. Ce que vous voulez faire, c'est obtenir l'existant pour arrêter l'animation.

Une façon de le faire est:

let vc = (GIDSignIn.sharedInstance().uiDelegate as! SignInViewController) 
vc.stopanimating() 

Vous pourriez vouloir factoriser plus tard, mais cela devrait vous mettre sur le bon chemin!

0

Vous devez supprimer l'indicateur d'activité de sous-vue. Modifier votre stopanimating()

func stopanimating() { 
     print("stop animating function running") 
     DispatchQueue.main.async { 
      self.activityIndicator.stopAnimating() 
      self.activityIndicator.removeFromSuperview() 
      UIApplication.shared.endIgnoringInteractionEvents() 
     } 
} 
2

Ceci est parce que vous créez une nouvelle instance de SignInViewController dans appDelegate. C'est SignInViewController().stopanimating(). Vous devez appeler la même instance pour arrêter d'animer l'indicateur d'activité.

+0

Belle explication. D'où +1. J'ai posté la solution aussi. –

1

Qu'est-ce que cela signifie? SignInViewController(). Cela signifie que vous créez une instance différente de votre SignInViewController et que, par conséquent, votre indicateur d'activité n'est pas présent sur cette instance.

Solution - La première solution consiste à obtenir l'instance sur laquelle vous avez montré l'indicateur d'activité. Cela signifie que vous devez obtenir currentViewController Instance dans votre cas. La deuxième solution consiste à déplacer votre méthode func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) vers votre classe SignInViewController.