Boolean döner görünüşüdür denetleyicisinde karşılık gelen erişim değere mümkün nil ve

oy
0

Sonra bir viewcontroller geri delmek ve bir fonksiyon çalıştırmak tetiklemelidir bir boolean değeri - Ben çekleri arka uç eposta varsa bir usermodel var. Ancak değer değişmez ve ben usermodel bu değeri değiştirmek çalışıyorum ama erişilemez. Ben işi yapmaz anlamak .. ama sorunu çözmek için nasıl bilmiyorum.

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
                      }
        }
    } 
Oluştur 13/01/2020 saat 21:52
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

İşte önermek yapardım. Muhtemelen yerinde bunlardan bazıları vardır:

  1. Bir oluşturma PasswordResetViewControllernesneyi bir etmiştir @IBAction func resetButtonClickedhangi tekmeler şifre sıfırlama işlemine kapalı bir düğme ya da her türlü, tarafından tetiklenen.
  2. Bir oluşturma UserManagersınıfı. Bu sınıf uygulamanızdaki tüm profil yönetimi Çalışanlarımızdan sorumludur. Diğer şeylerin yanı sıra, bu kullanıcı şifrelerini sıfırlamak için yeteneği vardır. Bu UserManagermuhtemelen tekil, şimdilik bunu' sprobably yeterince iyi olurdu.
  3. Yeni oluştur UserManagerDelegateprotokolü. Buna göre gerekli olan tüm yetenekleri ekleyin UserManagerne olduysa onları bilgilendirmek için. Örneğin: var passwordResetHasFailed: Bool { get set }.
  4. Senin uzatın PasswordResetViewControllerBu protokole uygundur.
  5. Kişisel VC tekil bir başvuru alır UserManagero andan itibaren o erişmek için bir örnek değişkeninde saklar ve kullanımları, paylaşılan nesne nesne.
  6. Senin Make PasswordResetViewControllerile, kullanıcı yöneticisine delege olarak kayıt kendisiniuserManager.delegate = self
  7. @IBAction func resetButtonClickedSadece arayacakuserManager.resetPassword()
  8. Sizin UserManagero kullanıcının şifresini sıfırlamak için yapması gereken neyse yapar.
  9. Tamamlandığında, bu diyeceğiz self.delegate?.passwordResetHasFailed = true/false.
  10. Senin bu yana PasswordResetViewControllerbir temsilci olarak kendini tescil UserManagerişlemi yapılır, bunun passwordResetHasFailedözelliği o (ne olursa olsun, bazı kullanıcı arayüzünü veya güncelleyerek) yanıt verdiklerini bir şans vererek, değişecektir.

Orada bu yaklaşımın bazı sınırlamalar vardır, ancak başlamak için iyi bir yoldur. nota Bazı şey:

  1. Bu, birim testi senin sağlar PasswordResetViewController. Bir oluşturabilir MockUserManagerve seti tesPasswordResetViewController.userManager = MockUserManager()kullanıcı yöneticisi ve testi ayırmayı sağlayan PasswordResetViewControllerizolasyon.
  2. (sadece 1 delege nesnesi olabilir beri) temsilci çağrı arka almak için abone için birden fazla nesne gerekiyorsa sorunları çalıştırmak gerekir. O noktada, Promises, RxSwift veya birleştirin gibi bir şey kullanmaya geçiş yapabilirsiniz. Ama bu daha sonra bir sorun, ve göç kolay olacaktır.
Cevap 13/01/2020 saat 22:15
kaynak kullanıcı

oy
1

@Alexander off gidiyor - Eski Monica ve ne kodu sorunu yaklaşım gibi bakmak ne varsayalım.

MVC kullanarak:

Klasör Modellerinde (veri / mantık kısmı)

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

Singleton tasarım uygulayarak Kullanıcı Yöneticisi sınıfı

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

Yani, Şimdi Kontrolörleri klasörünü ve biz bire-bir ilişki beri temsilci tasarım deseni kullanacaktır. olsaydı birini çoğa görünümü kontrolörü ile vardı. Kullanım gözlemciler.

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


}
}
Cevap 14/01/2020 saat 04:05
kaynak kullanıcı

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