Переключение взглядов с Alamofire результат и настоящее () - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь создать экран аутентификации (входа в систему) для моего приложения.Я использую Alamofire и SwiftyJson.Но я пробовал каждое решение, которое приходит мне в голову, чтобы решить мою проблему.

Ошибка, которую я получаю: Попытка представить viewcontroller, для которого viewController отсутствует в иерархии окон!

Проблема: Когда янажмите кнопку входа на моем экране, я успешно получил имя пользователя и пароль от моего сервиса.Я использую «response.result.isSuccess», чтобы я мог аутентифицировать пользователя на следующей странице после этого шага.Я впервые работаю с alamofire, и я не могу найти решение этой проблемы.

Где это происходит: Когда я получаю результат от службы (логическое значение), я хочу перенаправить пользователя к следующемустр.Я пометил его внизу // ********* Ошибка *********

Я попытался поместить запрос в мой контроллер, который разрушает мою архитектуру MVC, поэтому янужен лучший способ сделать это.Я сталкиваюсь с этой ошибкой в ​​течение 2 дней.

Мой класс менеджера отдыха;

class restManager {
    var requestType: String?
    var page = loginPage()
    var baseURL = "myUrl" // my service url lies down here on my code
    init(type: String){
        self.requestType = type
    }
    func builder(info: userInfo){
        if(requestType == "get"){
            makeGetRequest(path: baseURL, info: info)
        }
    }

    private func makeGetRequest(path: String, info : userInfo) {
        let params : [String: String] = ["sUser" : nm, "sPass" : ps, "sToken": "''"]
        get(parameters: params)
    }

    private func get(parameters: [String: String]){
        Alamofire.request(baseURL, method:.get ,parameters: parameters).responseJSON { response in
            print("Result: \(response.result)")
            if let json = response.result.value {
                print("JSON: \(json)")
                self.page.auth(res: true)
            }
        }
    }
}

И мой контроллер представления loginPage;

class loginPage: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var logo: UIImageView!
    @IBOutlet weak var usernameTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    private var loginInfo = userInfo()
    private var mng: restManager?
    @IBAction func loginButton(_ sender: roundButton) {
        if(usernameTextField.text != "" && passwordTextField.text != ""){
            loginInfo.setUsername(info: usernameTextField.text)
            loginInfo.setPassword(info: passwordTextField.text)
            let mng = restManager(type: "get")
            mng.builder(info: loginInfo)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

    func auth(res: Bool){
        if (res) {
            let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
            let nextViewController = storyBoard.instantiateViewController(withIdentifier: "homePageNavCtrl") as! homePageNavCtrl
            self.present(nextViewController, animated:true, completion:nil) // *********Error********
        } else {
            let alert = UIAlertController(title: "Error", message: "Invalid username and password.", preferredStyle: UIAlertController.Style.alert)
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }

Я хочу показать свойконтроллер навигации после входа пользователя, но этого не происходит.

1 Ответ

1 голос
/ 28 июня 2019

Используйте замыкания / обратные вызовы, поэтому после получения ответа будут вызываться ваши успешные и ошибочные обратные вызовы. Вот пример этого метода.

class func alamofireRequest(URLString: String, parameters : Parameters, method:HTTPMethod, successCallback: @escaping (NSDictionary) -> Void, errorCallBack: @escaping (String) -> Void) -> Void {

    Alamofire.request(URLString, method: method, parameters: parameters).responseJSON { response in
        print(response)
        if let JSON = response.result.value as? [String: Any] {
            print(JSON)
            successCallback(JSON as NSDictionary)
        } else {
            errorCallBack("JSON Doesn't Exist")
        }
    }

}

и вызвал этот метод в вашем классе как

 let params : [String: String] = ["sUser" : nm, "sPass" : ps, "sToken": "''"]
        get(parameters: params)

      restManager.alamofireRequest(URLString: url,method:.get parameters: params, successCallback: { (dict) in


                // Yahoo! You get the response do whatever you want


            }) { (error) in


              // Show error

            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...