बूलियन रिटर्न दृश्य नियंत्रक पर प्रतिक्रिया से पहुँच मूल्य को शून्य और असमर्थ

वोट
0

तो मैं वापस एक ViewController और गहराई में जाने और एक बूलियन मान कि एक समारोह रन से सक्रिय होना चाहिए सेट - मैं एक usermodel कि चेक बैकएंड अगर ईमेल मौजूद है। हालांकि मूल्य में कोई बदलाव नहीं है और मैं usermodel से मान बदलने के लिए कोशिश कर रहा हूँ, लेकिन यह सुलभ नहीं है। मुझे समझ में क्यों यह काम नहीं करता .. लेकिन समस्या का समाधान कैसे पता नहीं है।

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
                      }
        }
    } 
13/01/2020 को 23:52
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
0

यहाँ मैं क्या सुझाव है कि है। आप शायद पहले से ही जगह में इनमें से कुछ हैं:

  1. एक बनाएं PasswordResetViewControllerवस्तु एक है @IBAction func resetButtonClickedएक बटन या जो कुछ भी है, जो किक पासवर्ड रिसेट प्रक्रिया को बंद से शुरू हो रहा।
  2. एक बनाएं UserManagerवर्ग। इस वर्ग आपके ऐप की पूरी प्रोफ़ाइल प्रबंधन गतिविधियां लिए जिम्मेदार है। अन्य बातों के अलावा, यह उपयोगकर्ता पासवर्ड रीसेट करने की क्षमता है। यह UserManagerशायद एक सिंगलटन, कि 'अब के लिए sprobably अच्छा पर्याप्त होगा।
  3. एक नया बनाएं UserManagerDelegateप्रोटोकॉल। यह में जोड़े सभी क्षमताओं है कि के लिए आवश्यक हैं UserManagerउन्हें जो कुछ भी हुआ के बारे में सूचित करने के लिए। उदाहरण के लिए: var passwordResetHasFailed: Bool { get set }
  4. अपने बढ़ाएँ PasswordResetViewControllerइस प्रोटोकॉल के अनुरूप हैं।
  5. आपका कुलपति सिंगलटन के लिए एक संदर्भ हो जाता है UserManagerतब से साझा उद्देश्य यह है कि उपयोग करने के लिए वस्तु, एक उदाहरण चर में दुकानों यह, और का उपयोग करता है।
  6. अपने बनाओ PasswordResetViewControllerउपयोगकर्ता प्रबंधक को प्रतिनिधि के रूप में रजिस्टर ही है, साथuserManager.delegate = self
  7. @IBAction func resetButtonClickedबस फोन करेगाuserManager.resetPassword()
  8. आपका UserManagerयह उपयोगकर्ता का पासवर्ड रीसेट करने के लिए क्या करने की जरूरत है जो कुछ भी करता है।
  9. इसके पूर्ण हो जाने, यह फोन करता हूँ self.delegate?.passwordResetHasFailed = true/false
  10. चूंकि आपका PasswordResetViewControllerके प्रतिनिधि के रूप में खुद को पंजीकृत UserManager, जब ऑपरेशन किया जाता है, इसकी passwordResetHasFailedसंपत्ति बदल जाएगा, यह जवाब के लिए एक मौका है (कुछ यूआई या जो कुछ भी अपडेट करके) दे रही है।

इस दृष्टिकोण के लिए कुछ सीमाएं हैं, लेकिन यह एक सभ्य तरीका आरंभ करने के लिए है। टिप्पणी करने के लिए कुछ बात:

  1. यह आपको इकाई परीक्षण अपने की सुविधा देता है PasswordResetViewController। आप एक बना सकते हैं MockUserManager, और सेट tesPasswordResetViewController.userManager = MockUserManager()आप उपयोगकर्ता प्रबंधक, और परीक्षण को अलग करने के लिए अनुमति देता है, PasswordResetViewControllerअलगाव में।
  2. यदि आप प्रतिनिधि कॉल पीठ प्राप्त करने के लिए (के बाद से वहाँ केवल 1 प्रतिनिधि वस्तु हो सकता है) सदस्यता के लिए एक से अधिक ऑब्जेक्ट की जरूरत में समस्याएं आ रही हूँ। उस समय, आप वादे, RxSwift या कम्बाइन की तरह कुछ का उपयोग करना शुरू कर सकते हैं। लेकिन यह एक बाद में समय के लिए एक समस्या है, और प्रवास आसान होगा।
14/01/2020 को 00:15
का स्रोत उपयोगकर्ता

वोट
1

@Alexander के बंद जा रहे हैं - फिर से बहाल करते मोनिका और क्या मैं क्या कोड आपकी समस्या दृष्टिकोण की तरह लग रहे करने के लिए मान लेते हैं।

MVC का उपयोग करना:

फ़ोल्डर मॉडल में (डेटा / तर्क हिस्सा)

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

उपयोगकर्ता प्रबंधक वर्ग सिंगलटन डिजाइन को लागू करने

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

तो, नियंत्रकों में अब फ़ोल्डर और के बाद से हम एक एक-से-एक संबंध हम प्रतिनिधि डिज़ाइन पैटर्न का उपयोग करेगा। एक-से-कई दृश्य नियंत्रक के साथ था, तो था। उपयोग पर्यवेक्षकों।

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

में 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") }


}
}
14/01/2020 को 06:05
का स्रोत उपयोगकर्ता

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