Boolske returnerer nil og ute av stand til å få tilgang verdien fra responsen på visning controller

stemmer
0

Jeg har en usermodel som sjekker backend om e-posten eksisterer - da jeg bore tilbake i en viewcontroller og sette en boolsk verdi som skal utløse en funksjon løp. Men verdien er uendret, og jeg prøver å endre denne verdien fra usermodel men det er ikke tilgjengelig. Jeg forstår hvorfor det ikke fungerer .. men vet ikke hvordan de skal løse problemet.

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
                      }
        }
    } 
Publisert på 13/01/2020 klokken 23:52
kilden bruker
På andre språk...                            


2 svar

stemmer
0

Her er hva jeg ville foreslå. Du har sannsynligvis noen av disse på plass allerede:

  1. Opprett et PasswordResetViewControllerobjekt har en @IBAction func resetButtonClickedutløst av en knapp eller noe, som starter tilbakestille passordet.
  2. Lag en UserManagerklasse. Denne klassen er ansvarlig for alle profilbehandlings activies i appen. Blant annet har den evnen til å tilbakestille brukerpassord. Dette UserManagervil trolig være et enkelt, at' sprobably god nok for nå.
  3. Opprett en ny UserManagerDelegateprotokoll. Legg til det alle funksjoner som kreves av UserManagerå informere dem om hva som skjedde. For eksempel: var passwordResetHasFailed: Bool { get set }.
  4. Utvid PasswordResetViewControllersamsvar med denne protokollen.
  5. Din VC får en referanse til singleton UserManagerobjekt, lagrer den i en instansvariabel, og bruker som får tilgang til delt objekt fra da av.
  6. Gjør din PasswordResetViewControllerregister seg som delegat til brukeren manager, meduserManager.delegate = self
  7. Den @IBAction func resetButtonClickedvil bare ringeuserManager.resetPassword()
  8. Din UserManagergjør hva den trenger å gjøre for å tilbakestille brukerens passord.
  9. Når det er gjort, vil det ringe self.delegate?.passwordResetHasFailed = true/false.
  10. Siden PasswordResetViewControllerregistrert seg som delegat på UserManager, når operasjonen er ferdig, det passwordResetHasFailedvil eiendommen bli endret, noe som gir den en sjanse til å svare (ved å oppdatere noen UI eller hva).

Det er noen begrensninger i denne tilnærmingen, men det er en anstendig måte å komme i gang. Noen ting å merke seg:

  1. Dette lar deg enheten testen din PasswordResetViewController. Du kan opprette en MockUserManager, og sett tesPasswordResetViewController.userManager = MockUserManager(), slik at du kan skille ut brukeren manager, og test PasswordResetViewControlleri isolasjon.
  2. Du vil kjøre inn i problemer hvis du trenger flere objekter å abonnere på delegat samtale ryggen (siden det bare kan være en delegat objekt). På dette punktet, kan du bytte til å bruke noe som løfter, RxSwift eller kombinere. Men det er et problem for et senere tidspunkt, og migrasjon ville bli lett.
Svarte 14/01/2020 kl. 00:15
kilden bruker

stemmer
1

Går ut av @Alexander - Reaktivere Monica og det jeg antar hva koden skal se ut til å nærme seg problemet.

Ved hjelp av MVC:

I modeller folder (data / logiske delen)

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

User Manager klasse søker Singleton design

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

Så, nå i Controllers mappen, og siden vi en en-til-en-relasjon vil vi bruke delegat design mønster. Hvis hadde hatt en-til-mange med utsikt kontrolleren. Bruk observatører.

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

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


}
}
Svarte 14/01/2020 kl. 06:05
kilden bruker

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