Использование присутствует в UIViewController правильно - PullRequest
0 голосов
/ 04 февраля 2019

Я сталкиваюсь с проблемой, что я не могу представить динамический UIViewController в моем классе, используя "self".Он говорит мне, что «Значение типа» (LoginScreenVC) -> () -> (LoginScreenVC) «не имеет члена« view »».

Это будет работать с использованием замыкания, например, if let loginScreen = UIStoryBoard ..., но поскольку UIViewController для переключения является динамическим, я не могу привести его к определенному UIViewController.

Есть ли другой способ представитьViewController?

Это мой код:

SWIFT 4.2 / XCode 10.1

import UIKit

class LoginScreenVC: UIViewController {
    let myTokenHandler = TokenHandler()

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

    @IBAction func loginButton(_ sender: Any) {
        print("Login button pressed")

        let usernameInputField = self.view.viewWithTag(6548) as! UITextField
        let passwordInputField = self.view.viewWithTag(6549) as! UITextField

        userInput = usernameInputField.text!
        passInput = passwordInputField.text!

        // call completion handler
        requestToken(success: handlerBlock)

    }
    // completion handler step 1: request token and get redirect string to switch screen
    func requestToken(success: (String) -> Void) {
        let requestResult = myTokenHandler.requestToken(password: passInput, username: userInput)
        success(requestResult)
    }

    // completion handler step 2: use redirect string to switch screen
    let handlerBlock: (String) -> Void = { redirect in
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let loginScreen = storyboard.instantiateViewController(withIdentifier: redirect)
            self.present(loginScreen, animated: true, completion: nil) //Value of type '(LoginScreenVC) -> () -> (LoginScreenVC)' has no member 'view'
    }
}

1 Ответ

0 голосов
/ 04 февраля 2019

Вы говорите:

let handlerBlock: (String) -> Void = { redirect in
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let loginScreen = storyboard.instantiateViewController(withIdentifier: redirect)
    self.present(loginScreen, animated: true, completion: nil)
}

Проблема в том, что вы используете термин self в контексте, где нет self.(Ну, есть self, но это не то, что вы думаете.) present - это метод экземпляра UIViewController, поэтому self должен быть экземпляром UIViewController;и в этом контексте это не так.

Я могу придумать полдюжины способов выразить то, что вы пытаетесь выразить, но самым простым, вероятно, было бы переписать это как:

func handlerBlock(_ redirect:String) -> Void {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let loginScreen = storyboard.instantiateViewController(withIdentifier: redirect)
    self.present(loginScreen, animated: true, completion: nil)
}

Теперь handlerBlock - это метод экземпляра , а self имеет смысл - это именно тот экземпляр, который является именно тем, что вы хотите.Остальная часть вашего кода остается неизменной, поскольку голое имя handlerBlock в выражении requestToken(success: handlerBlock), как и прежде, является именем функции.

...