Boolean возвращает NIL и не осуществляется доступ к значению от ответа на вид контроллера

голоса
0

У меня есть usermodel, что проверяет бэкенд, если адрес электронной почты существует - то я просверлить обратно в ViewController и установить логическое значение, которое должно вызвать функцию запуска. Однако значение не изменяется, и я пытаюсь изменить это значение из 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 в 21:52
источник пользователем
На других языках...                            


2 ответов

голоса
0

Вот что я хотел бы предложить. Вы, вероятно, некоторые из них на месте уже:

  1. Создание PasswordResetViewControllerобъекта есть @IBAction func resetButtonClickedзапускается с помощью кнопки или независимо от того , какой кайф от процесса сброса пароля.
  2. Создать UserManagerкласс. Этот класс отвечает за все activies управления профилем в вашем приложении. Среди прочего, он имеет возможность сброса паролей пользователей. Это UserManager, вероятно , будет синглтон, что»sprobably достаточно хорошо сейчас.
  3. Создать новый UserManagerDelegateпротокол. Добавьте к этому все возможности, которые требуются , UserManagerчтобы сообщить им , что случилось. Например: var passwordResetHasFailed: Bool { get set }.
  4. Продлить ваше PasswordResetViewControllerсоответствие с этим протоколом.
  5. Ваш VC получает ссылку на одноплодном 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. Вы будете столкнуться с проблемами, если вам нужно несколько объектов, чтобы подписаться на получение спины делегат вызовов (поскольку может быть только один объект делегата). В этот момент вы можете переключиться на использование что-то вроде Promises, RxSwift или Объединить. Но это проблема для более позднего времени, и миграция будет легко.
Ответил 13/01/2020 в 22: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 в 04:05
источник пользователем

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