Boolean vrátí nulová a nelze získat přístup k hodnotě z odpovědi na kontroleru pohledu

hlasů
0

Mám usermodel který kontroluje backend v případě, že e-mail existuje - a pak jsem se vrtat zpět do viewcontroller a nastavit logickou hodnotu, která by měla vyvolat funkci běh. Nicméně hodnota se nemění a já se snaží změnit tuto hodnotu od usermodel ale není přístupná. Chápu, proč to nefunguje .. ale nevím, jak tento problém vyřešit.

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
                      }
        }
    } 
Položena 13/01/2020 v 23:52
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Tady je to, co bych navrhoval. Pravděpodobně budete muset některé z nich na svém místě již:

  1. Vytvořte PasswordResetViewControllerobjekt má @IBAction func resetButtonClickedspuštěno tlačítkem nebo cokoliv, který startuje proces resetování hesla.
  2. Vytvořit UserManagertřídu. Tato třída je zodpovědná za všechny activies řízení profilu ve vaší aplikaci. Mimo jiné má schopnost obnovit uživatelská hesla. To UserManagerby asi bylo ojedinělým, že‘sprobably dost dobré pro tuto chvíli.
  3. Vytvořte nový UserManagerDelegateprotokol. Přidejte k tomu všechny možnosti, které jsou požadovány UserManager, aby je informoval o co se stalo. Například: var passwordResetHasFailed: Bool { get set }.
  4. Prodlužte si PasswordResetViewControllerv souladu s tímto protokolem.
  5. Váš VC dostane odkaz na jediný UserManagerobjekt, ukládá ji do proměnné instance, a použití, které s přístupem sdílený objekt od té doby.
  6. Udělej si svůj PasswordResetViewControllerregistr sebe jako delegát uživatelského manažera, suserManager.delegate = self
  7. @IBAction func resetButtonClickedBude jen zavolatuserManager.resetPassword()
  8. Váš UserManagerdělá, co je třeba udělat, aby obnovit heslo uživatele.
  9. Když se to dělá, bude to říkat self.delegate?.passwordResetHasFailed = true/false.
  10. Vzhledem k tomu, PasswordResetViewControllerregistrovaná sebe jako delegát UserManager, když je operace vykonané její passwordResetHasFailedbude vlastnost měnit, což jí dává šanci reagovat (změnou nějaké UI nebo cokoliv).

Existují určitá omezení tohoto přístupu, ale je to slušný způsob, jak začít. Některé věc k poznámce:

  1. To vám umožní jednotka prověří vaši PasswordResetViewController. Můžete vytvořit MockUserManagera nastavit tesPasswordResetViewController.userManager = MockUserManager(), což umožňuje oddělit správce uživatele a zkoušku PasswordResetViewControllerv izolaci.
  2. Budete narazit na problémy, pokud budete potřebovat více objektů se přihlásit k odběru delegáta zpětná volání (protože tam může být pouze jeden delegát objekt). V tomto bodě, můžete přepínat s pomocí něco jako slibuje RxSwift nebo kombinace. Ale to je problém na pozdější dobu, a migrace by bylo snadné.
Odpovězeno 14/01/2020 v 00:15
zdroj uživatelem

hlasů
1

Odjíždí z @Alexander - obnovit Monica a co já předpokládám, co kód vypadat přiblížit váš problém.

Používání MVC:

V modelech složky (data / logika část)

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

Třída Správce uživatelů aplikací ojedinělým designem

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

Takže teď v kontroléry složky a od té doby jsme vztahu one-to-one budeme používat delegáta návrhový vzor. Kdyby měl one-to-many se kontroleru pohledu. Použijte pozorovatelé.

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

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


}
}
Odpovězeno 14/01/2020 v 06:05
zdroj uživatelem

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