Logikai nil, és nem fér értéket választ nézetvezérlőben

szavazat
0

Van egy usermodel, hogy az ellenőrzéseket a háttér, ha az e-mail létezik - akkor fúrni vissza egy viewcontroller és állítson be egy logikai érték, amelyek előidézik a függvény futtatását. Ugyanakkor ez az érték változatlan, és én próbálom megváltoztatni ezt az értéket a usermodel de ez nem hozzáférhető. Úgy értem, hogy miért nem működik .. de nem tudom, hogyan lehetne megoldani a problémát.

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
                      }
        }
    } 
A kérdést 13/01/2020 21:52
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

Itt van, amit lehetne. Valószínűleg van néhány ilyen helyen már:

  1. Hozzon létre egy PasswordResetViewControllerobjektum egy @IBAction func resetButtonClickedáltal kiváltott gombot, vagy bármi, ami indul a jelszó-visszaállítási folyamat.
  2. Hozzon létre egy UserManagerosztályt. Ez az osztály felelős az összes profil kezelése activies az alkalmazásban. Többek között azt a képességét, hogy állítsa vissza a felhasználói jelszavakat. Ez UserManagervalószínűleg egy egyke, hogy”sprobably elég jó most.
  3. Hozzon létre egy új UserManagerDelegateprotokollt. Add hozzá az összes képességeket, amelyek szükségesek a UserManagertájékoztatja őket bármi is történt. Például: var passwordResetHasFailed: Bool { get set }.
  4. Bővítse PasswordResetViewControllerfelelnie ezt a protokollt.
  5. A VC kap egy hivatkozást az egyedüli UserManagercélja, tárolja azt egy példányát változó, és használja, hogy hozzáférést a megosztott objektum majd.
  6. Tedd PasswordResetViewControllerregisztrálhatja magát, mint a küldött a felhasználó vezetője, auserManager.delegate = self
  7. Az @IBAction func resetButtonClickedmajd csak hívniuserManager.resetPassword()
  8. Ön UserManagernem akármi is kell tennie, hogy állítsa vissza a felhasználó jelszavát.
  9. Amikor ez megtörtént, akkor felhívom self.delegate?.passwordResetHasFailed = true/false.
  10. Mivel az Ön PasswordResetViewControllerregisztráltatta magát a delegáltja UserManager, amikor a művelet befejeződött, a passwordResetHasFailedtulajdon fog változni, így ez a lehetőség, hogy válaszolni (frissítésével néhány UI vagy bármi más).

Vannak korlátai ennek a megközelítésnek, de ez egy tisztességes módja az induláshoz. Néhány dolog, hogy megjegyzés:

  1. Ez lehetővé teszi, hogy a készülék teszt PasswordResetViewController. Akkor hozzon létre egy MockUserManager, és készlet tesPasswordResetViewController.userManager = MockUserManager(), amely lehetővé teszi, hogy külön ki a felhasználó vezetője, és a vizsgálati PasswordResetViewControllerelszigetelten.
  2. Akkor befut kérdéseket, ha szüksége van több objektumot fizetnünk kap küldött hívásai (hiszen csak 1 delegáltja objektum). Ezen a ponton, akkor kapcsoljuk be a segítségével olyasmi, mint Ígéretek, RxSwift vagy össze. De ez a probléma egy későbbi időpontban, és a migráció könnyű lenne.
Válaszolt 13/01/2020 22:15
a forrás felhasználó

szavazat
1

Megy ki a @Alexander - visszaállítás Monica és mit vállalnak, mi a kód, hogy néz ki, hogy a megközelítés a problémát.

Használata MVC:

A modell mappa (adat / logikai rész)

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 osztály alkalmazásával Singleton tervezési

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

Tehát most a szabályozók mappába, és mivel mi egy-egy kapcsolatban fogjuk használni megbízottja tervezési minta. Ha már volt egy a többhöz azzal a céllal, vezérlő. Felhasználási megfigyelők.

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

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


}
}
Válaszolt 14/01/2020 04:05
a forrás felhasználó

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