Boolean rendement nihil en geen toegang waarde in responsie op View Controller

stemmen
0

Ik heb een usermodel dat de controles de backend als de e-mail bestaat - dan moet ik weer boren in een ViewController en stel een Booleaanse waarde die een functie run moet activeren. Maar de waarde is ongewijzigd en ik probeer om deze waarde van het usermodel veranderen, maar het is niet toegankelijk. Ik begrijp waarom het niet werkt .. maar weet niet hoe het probleem op te lossen.

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
                      }
        }
    } 
De vraag is gesteld op 13/01/2020 om 23:52
bron van user
In andere talen...                            


2 antwoorden

stemmen
0

Hier is wat ik zou doen vermoeden. U hebt waarschijnlijk een aantal van deze op zijn plaats al:

  1. Maak een PasswordResetViewControllerobject heeft @IBAction func resetButtonClickedgeactiveerd door een knop of wat dan ook, die gaat van start een nieuw wachtwoord.
  2. Maak een UserManagerklasse. Deze klasse is verantwoordelijk voor alle profiel beheer activies in uw app. Onder andere dingen, het heeft de mogelijkheid om wachtwoorden van gebruikers te resetten. Dit UserManagerzou waarschijnlijk een singleton, dat' sprobably goed genoeg voor nu.
  3. Maak een nieuw UserManagerDelegateprotocol. Voeg daarbij alle mogelijkheden die door de vereiste zijn UserManagerom hen te informeren over wat er gebeurd is. Bijvoorbeeld: var passwordResetHasFailed: Bool { get set }.
  4. Breid uw PasswordResetViewControllervoldoen aan dit protocol.
  5. Uw VC krijgt een verwijzing naar het singleton UserManagerobject, slaat deze op in een instantie variabele, en toepassingen die de toegang van de gedeelde object vanaf dat moment.
  6. Maak uw PasswordResetViewControllerregister zichzelf als de afgevaardigde voor de gebruiker manager, metuserManager.delegate = self
  7. Het @IBAction func resetButtonClickedzal gewoon bellenuserManager.resetPassword()
  8. Je UserManagerdoet wat het moet doen om het wachtwoord van de gebruiker opnieuw in te stellen.
  9. Als het klaar is, zal het noemen self.delegate?.passwordResetHasFailed = true/false.
  10. Aangezien uw PasswordResetViewControllerzich geregistreerd als de afgevaardigde van de UserManagerIndien de operatie wordt uitgevoerd, zijn passwordResetHasFailedblijven eigendom worden veranderd, waardoor het een kans om te reageren (bijwerking van sommige UI of wat dan ook).

Er zijn een aantal beperkingen aan deze aanpak, maar het is een goede manier om te beginnen. Sommige wat op te merken:

  1. Hiermee kunt u unit test je PasswordResetViewController. U kunt maken MockUserManager, en set tesPasswordResetViewController.userManager = MockUserManager(), zodat u te scheiden van de gebruiker manager, en test PasswordResetViewControllerin isolement.
  2. U zult tegenkomen problemen als u meerdere objecten moet abonneren afgevaardigde terugbellen ontvangen (omdat er slechts 1 gedelegeerde object kan worden). Op dat moment kunt u overschakelen naar het gebruik iets als Promises, RxSwift of combineren. Maar dat is een probleem voor een later tijdstip, en de migratie gemakkelijk zou zijn.
antwoordde op 14/01/2020 om 00:15
bron van user

stemmen
1

Going off van @Alexander - Herstel Monica en wat ik neem aan dat wat de code te kijken als om uw probleem aan te pakken.

Met behulp van MVC:

In Models map (data / logica deel)

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 aanbrengen singleton ontwerp

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

Zo, nu in het Controllers map en aangezien we een één-op-één relatie zullen we gebruik maken van afgevaardigde ontwerppatroon. Als gehad one-to-many met de opvatting controller. Gebruik waarnemers.

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

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


}
}
antwoordde op 14/01/2020 om 06:05
bron van user

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