В настоящее время я реализую функцию регистрации в приложении чата, над которым я работаю.В моем 'RegistrationViewController' я хочу реализовать функцию с именем 'signupButtonPressed', которая направляет меня от контролера представления регистрации к контроллеру просмотра ListContacts.Если регистрация завершится неудачно, будет выполнена функция с именем 'showValidationError'.Ниже приведен отрывок кода из моего RegistrationViewController:
@IBAction func signupButtonPressed(_ sender: Any) {
let request = Signup.Request(
name: fullNameTextField.text!,
email: emailTextField.text!,
password: passwordTextField.text!
)
interactor?.createAccount(request: request)
}
func showValidationError(_ message: String) {
let alertCtrl = UIAlertController(title: "Oops! An error occurred", message: message, preferredStyle: .alert)
alertCtrl.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
self.show(alertCtrl, sender: self)
}
Я использую Swift Clean Architecture, поэтому я также свяжу код с моими файлами Registration Router, Model и Interactor:
1) Registrationinteractor.swift:
import Foundation
protocol SignupBusinessLogic {
func createAccount(request: Signup.Request)
}
class SignupInteractor: SignupBusinessLogic {
var viewController: SignupFormErrorLogic?
var router: (NSObjectProtocol & SignupRoutingLogic)?
var worker = UsersWorker()
func createAccount(request: Signup.Request) -> Void {
self.worker.signup(request: request) { user, error in
guard error == nil else {
print(error!)
self.viewController?.showValidationError("Error creating account!")
return
}
self.router?.routeToListContacts()
}
}
}
2) RegistrationModels.swift:
import Foundation
enum Signup {
struct Request {
var name: String
var email: String
var password: String
}
struct Response {
var user: User?
init(data: [String:Any]) {
self.user = User(
id: data["id"] as! Int,
name: data["name"] as! String,
email: data["email"] as! String,
chatkit_id: data["chatkit_id"] as! String
)
}
}
}
3) RegistrationRouter.swift:
import UIKit
@objc protocol SignupRoutingLogic {
func routeToListContacts()
}
class SignupRouter: NSObject, SignupRoutingLogic {
weak var viewController: SignupViewController?
func routeToListContacts() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destinationVC = storyboard.instantiateViewController(withIdentifier: "MainNavigator") as! UINavigationController
viewController!.show(destinationVC, sender: nil)
}
}
Функция регистрации в моем UsersWorker.swiftfile:
func signup(request: Signup.Request, completionHandler: @escaping (User?, UsersStoreError?) -> Void) {
let params: Parameters = [
"name": request.name,
"email": request.email,
"password": request.password
]
postRequest("/api/users/signup", params: params, headers: nil) { data in
guard data != nil else {
return completionHandler(nil, UsersStoreError.CannotSignup)
}
let response = Signup.Response(data: data!)
CurrentUserIDDataStore().setID(CurrentUserID(id: response.user?.chatkit_id))
let request = Login.Account.Request(
email: request.email,
password: request.password
)
self.login(request: request) { token, error in
guard error == nil else {
return completionHandler(nil, UsersStoreError.CannotLogin)
}
DispatchQueue.main.async {
completionHandler(response.user, nil)
}
}
}
}
Когда я вписываю регистрационные данные в UITextfields регистрации (fullNameTextField; emailTextField; passwordTextField) и нажимаю кнопку регистрации, возникает ошибка CannotSignup.Не уверен почему однако.Этот случай также можно найти в моем файле UsersWorker.swift:
enum UsersStoreError: Error {
case CannotLogin
case CannotSignup
case CannotFetchChatkitToken
}
Было бы замечательно, если бы кто-нибудь смог просмотреть код, чтобы понять, что может быть за проблема, и как я могу ее решить.Это?Если требуется дополнительная информация, просто спросите!