首页 > 解决方案 > 有没有办法将错误从 firebase 登录到错误处理?

问题描述

我有一个类,我调用 RealTimeAPI,然后是实际的 LoginViewController 类,我想做的是我想在我的 RealtimeApi 类中添加我的注册方法并在我的 LoginView 中调用注册。但是我需要在我的 LoginView 中进行错误处理,所以我需要从 registerfunction RealtimeAPIs Createuser 中的完成处理程序中抛出错误。这可能吗?到目前为止,这是我的代码。

实时API类

import Foundation
import Firebase

enum RegisterError: Error
{
    case IncompleteForm
    case NonMatchingForm
    case FirebaseError
}



class RealTimeApi
{
    private let Reference: DatabaseReference! = Database.database().reference()
    private var nilOrNot = [Bool]()
    public var errorDescription: String?
    
    func Register(FullName: String?, Username: String?, Email: String?, EmailVerification: String?, Password: String?, PasswordVerification: String? )
    {

        Auth.auth().createUser(withEmail: Email!, password: Password, completion: er, Error){

        }

    }
    
    func Login(Username:String, Password: String)
    {

    }
    func CheckLoggedinUser() -> Bool
    {
   
        let currentuser = Auth.auth().currentUser
        
        if(currentuser == nil)
        {
           return false

        }else{
            return true
        }
    }
}

登录视图

import UIKit
import Firebase

class LogInV: UIViewController {

    @IBOutlet weak var UsernameTxt: UITextField!
    @IBOutlet weak var PasswordTxt: UITextField!
    @IBOutlet var TextfieldRegistrationCollection: [UITextField]!
    @IBOutlet weak var ImageView: UIView!
    @IBOutlet weak var RegisterView: UIView!
    @IBOutlet weak var RV_VerticalAlignmentConstraint: NSLayoutConstraint!
    @IBOutlet weak var RegisterBtnO: UIButton!
 
    var Data = RealTimeApi()
    
    var TextFieldStyle = TextfieldStyling()

    override func viewDidLoad() {
        super.viewDidLoad()
        TextFieldStyle.StylizeTextField(StylizedTextField: UsernameTxt)
        TextFieldStyle.StylizeTextField(StylizedTextField: PasswordTxt)
        for i in 0...TextfieldRegistrationCollection.count - 1 {
            TextFieldStyle.StylizeTextField(StylizedTextField: TextfieldRegistrationCollection[i])  
        }
        
        TextfieldValidation()
        RV_VerticalAlignmentConstraint.constant += view.bounds.height         
    }
    override func viewDidAppear(_ animated: Bool) {
        RegisterBtnO.isEnabled = false
    }

    @IBAction func LoginButtons(_ sender: UIButton) {
        switch  sender.tag{
        case 0:
            break
        case 1:
            Slide()
            break
        default:
            print("button not pressed")
            break
        }
        
    }
    func Slide()
    {
        UIView.animate(withDuration: 1, delay: 0, options: .curveEaseIn, animations: {
            self.RV_VerticalAlignmentConstraint.constant -= self.view.bounds.height
            self.view.layoutIfNeeded()
            
            
            
        }, completion: nil)

    }
    @IBAction func RegisterBtn(_ sender: UIButton) {
        
    }

//Validate textfields so that user register does not work for empty input
    func TextfieldValidation()
    {
        for i in 0...TextfieldRegistrationCollection.count - 1
        {
            TextfieldRegistrationCollection[i].addTarget(self, action: #selector(LogInV.textFieldDidChange), for: UIControlEvents.editingChanged)

        }  
    }
    //selector function for controlling empty textfield
    @objc func textFieldDidChange(){
         var NoneIsEmpty = Int()
        
        for i in 0...TextfieldRegistrationCollection.count - 1{
            if let text = TextfieldRegistrationCollection[i].text, text.isEmpty == false {
                
                NoneIsEmpty += 1
                
                
            }
        }
        if(NoneIsEmpty == TextfieldRegistrationCollection.count)
        {
            RegisterBtnO.isEnabled = true
            
            
        }else{
            RegisterBtnO.isEnabled = false
        }
        NoneIsEmpty = 0
    }

    func showAlert(error: String)
    {
        let Erroralert = UIAlertController(title: "Error", message: error, preferredStyle: .alert)
        
        Erroralert.addAction(UIAlertAction(title: "Dissmiss",style: .cancel ,handler: {action in
            print("tapped actionbutton")
        }))
        
        present(Erroralert, animated: true)
        
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    }    
}

        }
        func UploadCustomerList(customer: Customer)
        {                
        }
        
    }

所以基本上我想做这样的事情

Auth.auth().createUser(withEmail: Email!, password: Password, completion: User, Error){
    
    throw Error

}

标签: swiftfirebaseerror-handlingfirebase-authentication

解决方案


我使用以下方法创建了一个辅助类:

func setupAlert(with title: String, with message: String?, viewController: UIViewController) {
            let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
            let cancel = UIAlertAction(title: "OK", style: .cancel, handler: nil)
            alert.addAction(cancel)
            viewController.present(alert, animated: true, completion: nil)
            
        }

您必须在要显示警报的参数中传递视图控制器。然后也可以传错误,可以在Auth.auth()中找到


推荐阅读