Boolean gibt nil zurück, und nicht in der Lage, den Zugang Wert von Antwort auf View-Controller

stimmen
0

Ich habe eine usermodel, dass die Kontrollen das Backend, wenn die E-Mail existiert - ich in einen Viewcontroller dann bohren zurück und einen Booleschen Wert, der eine Funktion Lauf auslösen soll. Allerdings ist der Wert unverändert und ich versuche, diesen Wert aus der usermodel zu ändern, aber es ist nicht zugänglich. Ich verstehe, warum es nicht funktioniert .. aber nicht wissen, wie das Problem zu beheben.

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
                      }
        }
    } 
Veröffentlicht am 13/01/2020 um 23:52
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Hier ist, was ich vorschlagen würde. Sie haben wahrscheinlich einige von ihnen an Ort und Stelle schon:

  1. Erstellen Sie ein PasswordResetViewControllerObjekt ein @IBAction func resetButtonClickedwelche Kicks aus dem Passwort - Reset - Prozess durch einen Knopf oder was auch immer, ausgelöst.
  2. Erstellen Sie eine UserManagerKlasse. Diese Klasse ist für alle Profilverwaltung activies in Ihrer Anwendung verantwortlich. Unter anderem hat er die Möglichkeit , Benutzer - Passwörter zurücksetzen. Dies UserManagerwürde wahrscheinlich ein Singleton sein, dass‘sprobably gut genug für jetzt.
  3. Erstellen Sie ein neues UserManagerDelegateProtokoll. Hinzufügen , um sie alle Funktionen , die durch die erforderlich sind , UserManagersie zu informieren , was passiert ist . Zum Beispiel: var passwordResetHasFailed: Bool { get set }.
  4. Erweitern Sie Ihre PasswordResetViewControllerzu diesem Protokoll entsprechen.
  5. Ihr VC erhält einen Verweis auf das Singleton - UserManagerObjekt, speichert sie in einer Instanzvariablen, und verwendet diese für den Zugriff auf das gemeinsame Objekt von da an.
  6. Machen Sie Ihre PasswordResetViewControllerRegister selbst als Delegierter an den Benutzer - Manager, mituserManager.delegate = self
  7. Das @IBAction func resetButtonClickedwird einfach anrufenuserManager.resetPassword()
  8. Ihr UserManagertut , was es tun muss , das Kennwort des Benutzers zurückgesetzt werden .
  9. Wenn es fertig ist , wird es nennen self.delegate?.passwordResetHasFailed = true/false.
  10. Da Ihre PasswordResetViewControllerselbst als Delegierter des registriert UserManager, wenn der Vorgang abgeschlossen ist, das passwordResetHasFailedwird Eigenschaft geändert wird, ist ihm eine Chance zu reagieren geben (durch einige UI aktualisieren oder was auch immer).

Es gibt einige Einschränkungen zu diesem Ansatz, aber es ist ein anständiger Weg, um loszulegen. Einige Sache zu beachten:

  1. Auf diese Weise können Sie Ihre Unit - Test PasswordResetViewController. Sie können einen erstellen MockUserManagerund Satz tesPasswordResetViewController.userManager = MockUserManager(), in dem Sie den Benutzer - Manager und Test trennen PasswordResetViewControllerin der Isolation.
  2. Sie werden auf Probleme stoßen, wenn Sie mehrere Objekte müssen abonnieren delegieren Rückrufe zu erhalten (da es nur 1 Delegatobjekt sein kann). An diesem Punkt können Sie mit so etwas wie Promises wechseln, RxSwift oder Kombinieren. Aber das ist ein Problem für einen späteren Zeitpunkt, und die Migration wäre leicht.
Beantwortet am 14/01/2020 um 00:15
quelle vom benutzer

stimmen
1

Abgehend von @Alexander - wieder einzusetzen Monica und was ich nehme an, was der Code aussehen, Ihr Problem zu nähern.

Mit MVC:

In Models Ordner (Daten / Logik-Teil)

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 Singleton Design Anwendung

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

So, nun in der Controller-Ordner und da wir eine Eins-zu-Eins-Beziehung werden wir delegieren Entwurfsmuster verwenden. Wenn musste mit dem View-Controller-one-to-many hatte. Verwenden Beobachter.

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


}
}
Beantwortet am 14/01/2020 um 06:05
quelle vom benutzer

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