2017-03-24 6 views
1

Hallo mein Englisch ist nicht sehr gut, ich entschuldige mich im Voraus.ViewController entlassen swift ios

Ich habe ein Problem mit meiner Anwendung. Das Szenario ist wie folgt: Ich habe meinen ViewController meinem ViewController-Controller zugewiesen, der mein Start ist. Ich habe andere Bildschirme, die ein Beschreibungsbildschirm sind, wo ich zwei Anmelde- und Registrierungsknöpfe habe, die, wenn sie vorgeladen sind, mich zu ihrem Controller bringen.

Nun, wenn ich bin auf der Log-Vollbild-Form und ich sende, um die entlassen:

Viewcontroller Registrierung

self.dismiss(animated: false, completion: nil) 

Und das alles in Ordnung, die nicht sichtbar ist, aber wenn der vorherigen Bildschirm eingeben, der war die Beschreibung habe ich eine Bestätigung, wenn bereits ein Benutzer ist, wenn es die entlassene Ordnung ist:

Viewcontroller Beschreibung App

self.dismiss(animated: false, completion: nil) 

Aber es führt die Aktion nicht aus.

-Code

UIViewController

class ViewController: UIViewController { 

    override func viewDidLoad() { 

     FIRAuth.auth()!.addStateDidChangeListener() { auth, user in 
      if user == nil { 
       let descriptionController = DescriptionController() 
       present(descriptionController, animated: true, completion: nil) 
      } 

     } 
    } 
} 

DescriptionController

class DescriptionController: UIViewController { 

    @IBOutlet weak var sign_in_custom: UIButton! 

    override func viewDidLoad() { 

     FIRAuth.auth()!.addStateDidChangeListener() { auth, user in 
      if user != nil { 
       self.dismiss(animated: false, completion: nil) 
      } 

     } 

     sign_in_custom.addTarget(self, action: #selector(changeToSingIn), for: [.touchUpInside]) 
    } 

    func changeToSingIn() { 
     let singInController = SingInController() 
     present(singInController, animated: true, completion: nil) 
    } 
} 

SingInController

class SingInController: UIViewController { 
    @IBOutlet weak var sign_in_custom: UIButton! 
    override func viewDidLoad() { 
     sign_in_custom.addTarget(self, action: #selector(singIn), for: [.touchUpInside]) 
    } 
    func showLoad() { 
     let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert) 
     alert.view.tintColor = UIColor.black 
     let loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(10, 5, 50, 50)) as UIActivityIndicatorView 
     loadingIndicator.hidesWhenStopped = true 
     loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray 
     loadingIndicator.startAnimating(); 
     alert.view.addSubview(loadingIndicator) 
     present(alert, animated: true, completion: nil) 
    } 
    func hideLoad() { 
     self.dismiss(animated: false, completion: nil) 
    } 
    func singIn() { 
     if (emailVarification()){ 
      if (passwordVarification()){ 
       showLoad() 
       guard let email = emailTextField.text else { return } 
       guard let password = passwordTextField.text else { return } 
       FIRAuth.auth()?.createUser(withEmail: email, password: password) { (user, error) in 
        hideLoad() 
        if (user != nil) { 
         self.dismiss(animated: false, completion: nil) 
        } else { 
         let alert = UIAlertController(title: "Error", message: "This is a error", preferredStyle: UIAlertControllerStyle.alert) 
         alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
         self.present(alert, animated: true, completion: nil) 
        } 
       } 
      } else { 
       let alert = UIAlertController(title: "Error", message: "This is a error", preferredStyle: UIAlertControllerStyle.alert) 
       alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
       self.present(alert, animated: true, completion: nil) 
      } 
     } else { 
      let alert = UIAlertController(title: "Error", message: "This is a error", preferredStyle: UIAlertControllerStyle.alert) 
      alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
      self.present(alert, animated: true, completion: nil) 
     } 
    } 
} 

sequence

Antwort

0

Dies liegt daran, dass der zweite Controller im Grunde nur an der Spitze des bestehenden platziert wurde. Die erste Ansicht wird noch in der zweiten Ansicht ausgeführt, und wenn die zweite Ansicht geschlossen wird, ruft die erste Ansicht ViewDidLoad nicht auf. Um es zu lösen, möchten Sie es wahrscheinlich in der Funktion ViewDidAppear hinzufügen.

+0

Danke hat mir geholfen –

1

Verwenden Sie diesen Code in ViewDidAppear:

FIRAuth.auth()!.addStateDidChangeListener() { auth, user in 
     if user != nil { 
      self.dismiss(animated: false, completion: nil) 
     } 

    } 

    sign_in_custom.addTarget(self, action: #selector(changeToSingIn), for: [.touchUpInside]) 
+0

Gute Arbeit. Es ist Arbeit für mich. –

0

Statt die DescriptionController selbst mit entlassen, ein besserer Weg wäre für den Viewcontroller stattdessen informieren würde, dass der Benutzer in und auch jede unterzeichnet zurück Fehler, falls erforderlich. Dann kann der ViewController alle zusätzlichen Schritte ausführen, die auf der Grundlage einer erfolgreichen oder fehlgeschlagenen Anmeldung erforderlich sind. Dies könnte erreicht werden, indem das Delegatenmuster verwendet wird (DescriptionController definiert ein Protokoll und ViewController implementiert es).

Verwandte Themen