Boolean nul et incapable de valeur d'accès de la réponse du contrôleur de vue

voix
0

J'ai un userModel qui vérifie le back-end si l'e-mail existe - je percer de nouveau dans une viewcontroller et définir une valeur booléenne qui devrait déclencher une course de fonction. Cependant, la valeur est inchangée et je suis en train de changer cette valeur du userModel mais il est pas accessible. Je comprends pourquoi il ne fonctionne pas .. mais je ne sais pas comment résoudre le problème.

static func sendEmailWithResetLink(email: String) {
        let params : Parameters = [
            PARAM_EMAIL : email
        ]
        request(URL_RESET_PASSWORD as String, method: .post, parameters: params, headers: nil).responseJSON {
            (response: DataResponse<Any>) in
            hideProgress()
            print(this is response \(response))
            switch(response.result)
                      {
                      case .success(_):
                       print(it did not fail)
                       let passwordResetVC = PasswordResetViewController()
                       passwordResetVC.hasFailed = false
                          break

                      case .failure(_):
                        print(it failed)
                        let passwordResetVC = PasswordResetViewController()
//here boolean is set that I am trying to access in viewcontroller 
                        passwordResetVC.hasFailed = true   
                          break
                      }
        }
    } 
Créé 13/01/2020 à 21:52
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Voici ce que je suggère. Vous avez probablement certains d'entre eux déjà en place:

  1. Créer un PasswordResetViewControllerobjet a un @IBAction func resetButtonClickeddéclenché par un bouton ou autre, qui lance la procédure de réinitialisation du mot de passe.
  2. Créer une UserManagerclasse. Cette classe est responsable de tous les activies de gestion de profil dans votre application. Entre autres, il a la possibilité de réinitialiser les mots de passe de l' utilisateur. Ce UserManagerserait probablement un singleton, ça suffit sprobably bon pour l' instant.
  3. Créer un nouveau UserManagerDelegateprotocole. Ajoutez à cela toutes les fonctionnalités requises par le UserManagerpour les informer de ce qui est arrivé. Par exemple: var passwordResetHasFailed: Bool { get set }.
  4. Prolongez votre PasswordResetViewControllerconformité à ce protocole.
  5. Votre CV obtient une référence au singleton UserManagerobjet, les stocke dans une variable d'instance, et utilise pour accéder à l'objet partagé à partir de là.
  6. Faites votre PasswordResetViewControllerregistre lui - même en tant que délégué au gestionnaire de l' utilisateur, avecuserManager.delegate = self
  7. Le @IBAction func resetButtonClickedappelera justeuserManager.resetPassword()
  8. Votre UserManagerfait ce qu'il doit faire pour réinitialiser le mot de passe de l'utilisateur.
  9. Une fois terminé, il va appeler self.delegate?.passwordResetHasFailed = true/false.
  10. Étant donné que votre PasswordResetViewControllerlui - même enregistré en tant que délégué du UserManager, lorsque l'opération se fait, sa passwordResetHasFailedpropriété sera modifiée, ce qui lui donne une chance de répondre (en mettant à jour une interface utilisateur ou autre).

Il y a des limites à cette approche, mais il est une manière décente pour commencer. Quelque chose à noter:

  1. Cela vous permet de tester votre unité PasswordResetViewController. Vous pouvez créer un MockUserManager, et ensemble tesPasswordResetViewController.userManager = MockUserManager(), vous permettant de séparer le gestionnaire de l' utilisateur, et un test PasswordResetViewControllerdans l' isolement.
  2. Vous rencontrez des problèmes si vous avez besoin de plusieurs objets pour vous abonner pour recevoir le dos d'appel de délégué (car il ne peut y avoir 1 objet délégué). À ce moment-là, vous pouvez passer à l'aide de quelque chose comme des promesses, RxSwift ou combiner. Mais c'est un problème pour plus tard, et la migration serait facile.
Créé 13/01/2020 à 22:15
source utilisateur

voix
1

Aller hors de @Alexander - Réintégrer Monica et ce que je suppose que le code pour ressembler à l'approche de votre problème.

En utilisant MVC:

Dans le dossier Modèles (données / partie logique)

public class User {
private var name: String!
private var userEmail: String!
public var hasFailed: Bool?

init() {
    name = ""
    userEmail = ""
    hasFailed = nil
}

deinit {
    name.removeAll()
    userEmail.removeAll()
    hasFailed = nil
}

public func setName(name: String) { self.name = name }

public func getName() -> String { return name }

public func setEmail(email: String) { userEmail = email }

public func getEmail() ->String { return userEmail }

public static func sendEmailWithRestLing(email: String) {
    // your other code

    switch response.result {
    case .success(_):
        //your code
        hasFailed = false
        break
    case .failuare(_):
        // your code
        hasFailed = true
        break
    }
}
}

classe Gestionnaire des utilisateurs appliquant la conception singleton

final class UserManager {
private var user = User()
static let instance = UserManager()

private init(){}

public func userName(name: String) {
    if (name.count > 3) {
        user.setName(name: name)
    }
    else { print("user name is too short") }
}

public func userEmail(email: String) {
    if (email.count > 3) {
        user.setEmail(email: email)
    }
    else { print("user email is too short") }
}

public func getUserName() -> String {
    let name = user.getName()

    if (name.isEmpty) { return "user name is Empty" }

    return name
}

public func getUserEmail() -> String {
    let email = user.getEmail()

    if (email.isEmpty) { return "user email is Empty" }

    return email
}

public func doKatieTask(link: String) -> Int {
    guard let myValue = user.hasFailed else {
        return -1
    }

    if (myValue) { return 1}

    return 0
}
}

Donc, maintenant dans les contrôleurs dossier et depuis que nous avons une à une relation que nous utiliserons modèle de conception de délégué. Si l'un avait eu à plusieurs avec le contrôleur de vue. Utiliser des observateurs.

class ViewController: UIViewController {

@IBOutlet weak var txtName: UITextField!
@IBOutlet weak var  txtEmail: UITextField!

var _hasFail: Bool!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

@IBAction func doTask() {
    UserManager.instance.userName(name: txtName.text!)
    UserManager.instance.userEmail(email: txtEmail.text!)

    switch UserManager.instance.doKatieTask(link: txtEmail.text!) {
    case 0:
        _hasFail = false
        break
    case 1:
        _hasFail = true
        break
    default:
        print("hasFailed is nil")
        break
    }

    if let vc = storyboard?.instantiateViewController(identifier: "passwordVC") as? PasswordResetViewController {
        vc.modalPresentationStyle = .fullScreen
        vc.delegate = self
        self.present(vc, animated: true, completion: nil)
    }
}

}

extension ViewController: KatieDelegate {
var hasFailed: Bool {
    get {
        return _hasFail
    }
    set {
        _hasFail = newValue
    }
}
}

Dans PasswordReset UIViewController

protocol KatieDelegate {
    var hasFailed: Bool { get set }
}


class PasswordResetViewController: UIViewController {

@IBOutlet weak var lblName: UILabel!
@IBOutlet weak var lblEmail: UILabel!

var delegate: KatieDelegate?


private var _hasFailed: Bool!

override func viewDidLoad() {
    super.viewDidLoad()

    lblName.text = UserManger.instance.getUserName()
    lblEmail.text = UserManger.instance.getUserEmail()

    if let delegate = delegate {
        print("The value for has failed is: .....\(delegate.hasFailed)!")
    }
    else { print("error with delegate") }


}
}
Créé 14/01/2020 à 04:05
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more