Jules Peter
Jules Peter

Reputation: 5

Error : "Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee0234ff0)"

I have this code and when I am running the App on the line with "super.viewDidLoad()", I have the "Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee0234ff0" error... Can someone help me please?

On internet they say me that I have to connect my Developer Account, but I don't have one.

This is the code :

import Foundation
import UIKit
import FirebaseAuth
import FirebaseDatabase



class SignUpController : UIViewController {



//Fonction pour scroller
private let scrollView: UIScrollView = {
    let scrollView = UIScrollView.self()
    scrollView.clipsToBounds = true
    return scrollView
    
}()

//MARK : Outlets
@IBOutlet weak var artistnameTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var confirmationPasswordTextField: UITextField!

@IBOutlet weak var signupButton: UIButton!
@IBOutlet weak var loginButton: UIButton!

//MARK : Properties


override func viewDidLoad() {
    super.viewDidLoad()
    viewDidLoad()
    
    
//Add subviews
    view.addSubview(scrollView)
    scrollView.addSubview(artistnameTextField)
    scrollView.addSubview(emailTextField)
    scrollView.addSubview(passwordTextField)
    scrollView.addSubview(confirmationPasswordTextField)
    scrollView.addSubview(signupButton)
    scrollView.addSubview(loginButton)
    
    //Design
    setupButtons()
    
    
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showLogin" {
        let VCDestination = segue.destination as! LoginController
        VCDestination.myMail = emailTextField.text!
    }
    if segue.identifier == "showLogin" {
        let VCDestination = segue.destination as! LoginController
        VCDestination.myPassword = passwordTextField.text!
    }
}




//MARK : Private Methods
private func setupButtons() {
    signupButton.layer.cornerRadius = 20
    
    loginButton.layer.cornerRadius = 20
    loginButton.layer.borderWidth = 3
    loginButton.layer.borderColor = UIColor.lightGray.cgColor
}

private func setupTextFieldManager() {
    artistnameTextField.delegate = self
    emailTextField.delegate = self
    passwordTextField.delegate = self
    
    let tapGesture = UITapGestureRecognizer (target: self, action: #selector(hideKeyboard))
    view.addGestureRecognizer(tapGesture)
}

//MARK : Actions
@IBAction func signUpButton(_ sender: UIButton) {
    performSegue(withIdentifier: "showLogin", sender: nil)
}



@objc private func hideKeyboard() {
    artistnameTextField.resignFirstResponder()
    emailTextField.resignFirstResponder()
    passwordTextField.resignFirstResponder()
}



@IBAction func signupButtonWasPressed(_ sender: UIButton) {
    if artistnameTextField !== "" as AnyObject && emailTextField !== "" as AnyObject && passwordTextField !== "" as AnyObject && confirmationPasswordTextField.text == passwordTextField.text {
        
        
        Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { (authResult, error) in
            if error != nil {
                print(error.debugDescription)
                self.alertUserLoginError()
            } else {
                print ("Inscription en cours...")
                
                let ref = Database.database().reference()
                let userID = Auth.auth().currentUser?.uid
                
                ref.child("users").child(userID!).setValue(["artistName": self.artistnameTextField.text])
                
                self.performSegue(withIdentifier: "goToHome", sender:  self)
            }
        }
        
    } else {
        print("Veuillez remplir tous les champs.")
    }
}
@IBAction func loginButtonWasPressed(_ sender: UIButton) {
    print("Redirection vers l'écran de connexion...")
}

func alertUserLoginError() {
    let alert = UIAlertController(title: "Erreur", message: "Veuillez remplir tous les champs", preferredStyle: .alert)
    
    alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler: nil))
    present(alert, animated: true)
}


}

extension SignUpController: UITextFieldDelegate{
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    
    return true
}


}

Thanks

Upvotes: 0

Views: 2674

Answers (1)

xTwisteDx
xTwisteDx

Reputation: 2472

Ok so for the sake of brevity, here's a concept called "App Lifecycle" which by its nature is the methods that are called by the iOS system and in a specific order. Remember that computers can only run one thing at a time, per CPU. So it must go in an order of some sort. The iOS lifecycle events are as follows.

  • loadView()
  • viewDidLoad()
  • viewWillAppear()
  • viewDidAppear()
  • didReceiveMemoryWarning()
  • viewWillDisappear()
  • viewDidDisappear()

Now bear in mind there are a few others depending on what you're doing but these are the most common ones.

With 90% of these lifecycle methods, there's something more that is going on in the background that you don't see. This is where the super.methodName() call comes into play. It allows you to add additional functionality at a given lifecycle event without losing any of the other functionality that is being provided by that method. Otherwise, you might lose something that is required to load the view. Eg, super.methodName retains all previous functionality.

Now, to your issue, you have the following lines of code.

override func viewDidLoad() {
    super.viewDidLoad()
    viewDidLoad()
    //A bunch more code after this.
} 

Looking at the Lifecycle methods, that are required in many cases, notice that you are calling viewDidLoad() inside of your super.viewDidLoad which means that your main thread gets stuck. It loops back through that method that called it, and then there it is again, another viewDidLoad() call. In turn, it loops, again, and again, and again, until it crashes. There is a time and a place for recursion, however, this is not one of them, and that's for a completely separate topic.

Ultimately your solution is to remove the viewDidLoad() method call after your super.viewDidLoad() and that will resolve the error that you're having.

Upvotes: 1

Related Questions