Retorna Boolean nulo e incapaz de valor acesso de resposta no controlador de vista

votos
0

Eu tenho um userModel que verifica o backend se o e-mail existe - então eu perfurar para trás em um viewcontroller e definir um valor booleano que deve acionar uma função prazo. No entanto, o valor não é alterado e eu estou tentando mudar este valor a partir do userModel mas não é acessível. Eu entendo por que ele não funciona .. mas não sei como resolver o problema.

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
                      }
        }
    } 
Publicado 13/01/2020 em 23:52
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Aqui está o que eu sugiro. Você provavelmente tem alguns destes em lugar já:

  1. Criar um PasswordResetViewControllerobjeto tem um @IBAction func resetButtonClickedacionado por um botão ou qualquer outra coisa, que começa o processo de redefinição de senha.
  2. Criar uma UserManagerclasse. Esta classe é responsável por todas as actividades piscatórias de gerenciamento de perfil no seu aplicativo. Entre outras coisas, ele tem a capacidade para redefinir senhas de usuários. Este UserManagerseria provavelmente um singleton, que' sprobably bom o suficiente para agora.
  3. Criar um novo UserManagerDelegateprotocolo. Adicione a isso todas as capacidades que são exigidas pelo UserManagerpara informá-los sobre o que aconteceu. Por exemplo: var passwordResetHasFailed: Bool { get set }.
  4. Estenda a sua PasswordResetViewControllerconformidade com este protocolo.
  5. Seu VC recebe uma referência para o singleton UserManagerobjeto, armazena em uma variável de instância, e usa isso para acessar o objeto compartilhado a partir de então.
  6. Faça o seu PasswordResetViewControllerpróprio registo como delegado para o gerente do usuário, comuserManager.delegate = self
  7. A @IBAction func resetButtonClickedsó vai chamaruserManager.resetPassword()
  8. Seu UserManagerfaz tudo o que ele precisa fazer para redefinir a senha do usuário.
  9. Quando ele é feito, ele vai chamar self.delegate?.passwordResetHasFailed = true/false.
  10. Desde o seu PasswordResetViewControllerpróprio registrado como o delegado do UserManager, quando a operação é feita, sua passwordResetHasFailedpropriedade será alterado, dando-lhe a chance de responder (atualizando alguns UI ou qualquer outro).

Existem algumas limitações para esta abordagem, mas é uma maneira decente para começar. Alguma coisa a nota:

  1. Isso permite que você teste de unidade de seu PasswordResetViewController. Você pode criar um MockUserManagere conjunto tesPasswordResetViewController.userManager = MockUserManager(), o que lhe permite separar o gerente do usuário e teste PasswordResetViewControllerde forma isolada.
  2. Você vai correr em problemas se precisar de vários objetos para se inscrever para receber retornos de chamada delegado (já que só pode haver um objeto de delegação). Nesse ponto, você pode passar a usar algo como Promises, RxSwift ou Combinar. Mas isso é um problema para um momento posterior, e a migração seria fácil.
Respondeu 14/01/2020 em 00:15
fonte usuário

votos
1

Saindo de @Alexander - Reintegrar Monica e que eu assumo o que o código para olhar como se aproximar de seu problema.

Usando MVC:

Em modelos pasta (dados / parte lógica)

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 User Manager aplicação de projeto 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
}
}

Então, agora nos controladores pasta e uma vez que uma relação de um-para-um, vamos utilizar padrão de design delegado. Se tivesse tido um-para-muitos com o controlador de vista. Use observadores.

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
    }
}
}

Em 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") }


}
}
Respondeu 14/01/2020 em 06:05
fonte usuário

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