Boolean nil e incapaz de valor de acceso de la respuesta en el controlador vista

votos
0

Tengo un UserModel que comprueba el back-end si existe el correo electrónico - entonces perforar de nuevo en un viewcontroller y establecer un valor booleano que deben dar lugar a una carrera de función. Sin embargo, el valor no cambia y estoy tratando de cambiar este valor de la UserModel pero no es accesible. Entiendo por qué no funciona .. pero no sé cómo resolver el 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 el 13/01/2020 a las 21:52
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Esto es lo que sugeriría. Es probable que tenga algunos de estos en su lugar ya:

  1. Crear un PasswordResetViewControllerobjeto tiene una @IBAction func resetButtonClickedactiva mediante un botón o lo que sea, que comienza el proceso de restablecimiento de contraseña.
  2. Crear una UserManagerclase. Esta clase es responsable de todas las Actividades al perfil de administración en su aplicación. Entre otras cosas, tiene la capacidad de restablecer contraseñas de usuario. Esto UserManagerprobablemente sería un producto único, que' sprobably buena suficiente por ahora.
  3. Crear un nuevo UserManagerDelegateprotocolo. Añadir a que todas las capacidades que se requieren por el UserManagerpara informarles de lo sucedido. Por ejemplo: var passwordResetHasFailed: Bool { get set }.
  4. Ampliar su PasswordResetViewControllerconformarse a este protocolo.
  5. Su VC obtiene una referencia a la singleton UserManagerobjeto, lo almacena en una variable de instancia, y los usos que para acceder al objeto compartido a partir de entonces.
  6. Haga su PasswordResetViewControllerregistro como el delegado al gestor de usuarios, conuserManager.delegate = self
  7. El @IBAction func resetButtonClickedacaba de llamaruserManager.resetPassword()
  8. Su UserManagerhace lo que tiene que hacer para restablecer la contraseña del usuario.
  9. Cuando se hace, se va a llamar self.delegate?.passwordResetHasFailed = true/false.
  10. Debido a que su PasswordResetViewControllerpropio registrados como el delegado de la UserManager, cuando se realiza la operación, su passwordResetHasFailedserá cambiado de propiedad, lo que le da la oportunidad de responder (mediante la actualización de alguna interfaz de usuario o lo que sea).

Hay algunas limitaciones a este enfoque, pero es una buena manera de empezar. Alguna cosa a la nota:

  1. Esto le permite a su unidad de prueba PasswordResetViewController. Se puede crear una MockUserManagery conjunto tesPasswordResetViewController.userManager = MockUserManager(), lo que le permite separar el gestor de usuarios, y la prueba PasswordResetViewControllerde forma aislada.
  2. Se encontrará con problemas si necesita varios objetos a suscribirse para recibir devoluciones de llamadas delegado (ya que no sólo puede ser objeto delegado 1). En ese punto, se puede cambiar a usar algo como Promises, RxSwift o Combinar. Pero eso es un problema para un momento posterior, y la migración sería fácil.
Respondida el 13/01/2020 a las 22:15
fuente por usuario

votos
1

Ir fuera de @Alexander - Restablecer Mónica y lo que supongo que lo que el código para que parezca acercarse a su problema.

El uso de MVC:

En los modelos de carpetas (datos / 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
    }
}
}

clase Administrador de usuarios la aplicación del diseño 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
}
}

Por lo tanto, ahora en la carpeta de controladores y ya que una relación uno-a-uno, utilizaremos el patrón de diseño delegado. Si había tenido uno-a-muchos con el 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
    }
}
}

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


}
}
Respondida el 14/01/2020 a las 04:05
fuente por usuario

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