J'essaie de créer une application de réseau social pour iOS pour un projet d'école. Mon Voici mon code: P> @ibaction code> fonction pour la connexion ne fonctionne pas et je ne sais pas pourquoi. L'erreur que je reçois est: "Seules les méthodes d'instance peuvent être déclarées @ibaction" class ViewController: UIViewController {
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var passwordField: UITextField!`
var userUid: String!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(_ animated: Bool){
if let _ = KeychainWrapper.standard.string(forKey: "uid") {
performSegue(withIdentifier: "Messages", sender: nil)
}
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "SignUp" {
if let destination = segue.destination as? SignUpVC {
if self.userUid != nil{
destination.userUid = userUid
}
if self.emailField.text != nil {
destination.emailField = emailField.text
}
if self.passwordField.text != nil {
destination.passwordField = passwordField.text
}
}
}
}
@IBAction func SignIn (_ sender: AnyObject) {
if let email = emailField.text, let password = passwordField.text{
Auth.auth().signIn(withEmail: email, password: password, completion:{
(user, error) in
if error == nil{
self.userUid = user?.user.uid
KeychainWrapper.standard.set(self.userUid, forKey: "uid")
self.performSegue(withIdentifier: "Messages", sender: nil)
} else {
self.performSegue(withIdentifier: "SignUp", sender: nil)
}
})
}
}
}
}
4 Réponses :
Fonction Func Préparez (pour SEGUE: UISTORYBOODSEGUEGUEGUEGUEGE, SENDER: Tout?) CODE> doit être en classe Scope non imbriqué à l'intérieur ViewDidAppear CODE> override func viewDidAppear(_ animated: Bool){
super.viewDidAppear(animated)
if let _ = KeychainWrapper.standard.string(forKey: "uid"){
performSegue(withIdentifier: "Messages", sender: nil)
}
}
@IBAction func SignIn (_ sender: AnyObject) {
if let email = emailField.text, let password = passwordField.text{
Auth.auth().signIn(withEmail: email, password: password, completion:{
(user, error) in
if error == nil{
self.userUid = user?.user.uid
KeychainWrapper.standard.set(self.userUid, forKey: "uid")
self.performSegue(withIdentifier: "Messages", sender: nil)
} else {
self.performSegue(withIdentifier: "SignUp", sender: nil)
}
})
}
}
func prepare(for segue: UIStoryboardSegue, sender: Any?){
if segue.identifier == "SignUp"{
if let destination = segue.destination as? SignUpVC {
if self.userUid != nil {
destination.userUid = userUid
}
destination.emailField = emailField.text
destination.passwordField = passwordField.text
}
}
}
La raison en est que votre et retirez-en à la fin du fichier p> p> p> Signin code> n'est pas une méthode d'instance, c'est une fonction imbriquée dans ViewDidAppear code>. Ajoutez une autre parenthèse de fermeture dans viewDidAppear code>
Vous vous préparez à SEGUE et la fonction de connexion a été nichée à l'intérieur de la méthode code> ViewDididAppear code>. Utiliser des commentaires peut aider à briser les fonctions visuellement.
class ViewController: UIViewController {
// MARK: Outlets
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var passwordField: UITextField!`
// MARK: Properties
var userUid: String!
// MARK: Lifecycle
override func viewDidAppear(_ animated: Bool) {
if let _ = KeychainWrapper.standard.string(forKey: "uid") {
performSegue(withIdentifier: "Messages", sender: nil)
}
}
// MARK: Navigation
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "SignUp" {
if let destination = segue.destination as? SignUpVC {
if self.userUid != nil{
destination.userUid = userUid
}
if self.emailField.text != nil {
destination.emailField = emailField.text
}
if self.passwordField.text != nil {
destination.passwordField = passwordField.text
}
}
}
}
// MARK: Actions
@IBAction func SignIn (_ sender: AnyObject) {
if let email = emailField.text, let password = passwordField.text{
Auth.auth().signIn(withEmail: email, password: password, completion:{
(user, error) in
if error == nil{
self.userUid = user?.user.uid
KeychainWrapper.standard.set(self.userUid, forKey: "uid")
self.performSegue(withIdentifier: "Messages", sender: nil)
} else {
self.performSegue(withIdentifier: "SignUp", sender: nil)
}
})
}
}
}
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "SignUp" {
if let destination = segue.destination as? SignUpVC {
if self.userUid != nil{
destination.userUid = userUid
}
if self.emailField.text != nil {
destination.emailField = emailField.text
}
if self.passwordField.text != nil {
destination.passwordField = passwordField.text
}
}
}
}
@IBAction func SignIn (_ sender: AnyObject) {
if let email = emailField.text, let password = passwordField.text{
Auth.auth().signIn(withEmail: email, password: password, completion:{
(user, error) in
if error == nil{
self.userUid = user?.user.uid
KeychainWrapper.standard.set(self.userUid, forKey: "uid")
self.performSegue(withIdentifier: "Messages", sender: nil)
} else {
self.performSegue(withIdentifier: "SignUp", sender: nil)
}
})
}
should be outside viewDidAppear
Pourquoi votre
Func Préparez-vous (pour SEGUE: UISTORYBOODSUEGUEGE, SENDER: TOUT?) CODE> Méthode à l'intérieur de la viewwillappear? c'est une mauvaise copie / pâte à ici ou vous devez le déplacer. Il semble également que votre ibaction pourrait également être à l'intérieur d'une autre méthode, que ce soit ou que vous avez déclaré une statique quelque part. S'il vous plaît ranger ce code, il est assez difficile de lire et de causer évidemment des problèmes.Votre erreur est en scopes. Les fonctions ne peuvent pas contenir d'autres fonctions à Swift.
Les fonctions peuvent contenir des fonctions, cependant, mettant la préparation: Intérieur ViewDidLoadLoad: est incorrecte.