我有这段代码,当我使用"super.viewDidLoad()"运行应用程序时,我有"Thread 1: EXC_BAD_ACCESS (code=2,address=0x7ffee0234ff0)“错误.有人能帮帮我吗?
在互联网上,他们说我必须连接我的开发者帐户,但我没有。
这是代码:
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
}
}谢谢
发布于 2020-07-28 21:28:57
为了简洁起见,这里有一个名为“AppLifecycle”的概念,它本质上是iOS系统按特定顺序调用的方法。请记住,计算机一次只能运行一件事情,每个CPU。所以它必须按某种顺序进行。iOS生命周期事件如下所示。
现在,请记住,还有其他几个取决于您正在做什么,但这些是最常见的。
有了90%的这些生命周期方法,在你看不到的背景中有更多的事情正在发生。这就是super.methodName()调用发挥作用的地方。它允许您在给定的生命周期事件中添加其他功能,而不会丢失该方法提供的任何其他功能。否则,您可能会丢失加载视图所需的内容。super.methodName保留了以前的所有功能。
现在,针对您的问题,您有以下代码行。
override func viewDidLoad() {
super.viewDidLoad()
viewDidLoad()
//A bunch more code after this.
} 看看在很多情况下都需要的生命周期方法,注意在viewDidLoad()中调用super.viewDidLoad,这意味着主线程被卡住了。它通过调用它的方法循环,然后又是另一个viewDidLoad()调用。反过来,它一次又一次地循环,直到崩溃。有一个时间和地方递归,然而,这不是其中之一,这是一个完全不同的主题。
最终,您的解决方案是在您的viewDidLoad()之后删除super.viewDidLoad()方法调用,这将解决正在发生的错误。
https://stackoverflow.com/questions/63142782
复制相似问题