【问题标题】:swift return key pressed event from subview programmatically以编程方式从子视图快速返回按键事件
【发布时间】:2018-04-06 05:53:35
【问题描述】:

我是 swift 新手,不使用故事板就可以创建我的应用程序。我创建了 logincontroller 并将 loginview 附加到它。当有人完成电子邮件和密码文本字段并从键盘按返回键时,我想检测事件以便处理用户的登录请求。

这是我的代码。

import UIKit

class LoginController: UIViewController {

 var loginView: LoginView!

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

func setupView() {
    let mainView = LoginView(frame: self.view.frame)
    self.loginView = mainView 
    self.view.addSubview(loginView)
}

以及 LoginView.swift 的代码

import UIKit

class LoginView: UIView {

override init(frame: CGRect) {
    super.init(frame: frame)
    setup()
}

func setup() {

    backgroundColor = .white
    let stackView = createStackView(views: [emailTextField,passwordTextField])
    addSubview(stackView)

    //autolayout constraints here

}

let emailTextField: UITextField = {
    let tf = UITextField(placeHolder: "Email")
    return tf
}()

let passwordTextField: UITextField = {
    let tf = UITextField(placeHolder: "Password")
    tf.isSecureTextEntry = true
    tf.returnKeyType = UIReturnKeyType.send
    return tf
}()

【问题讨论】:

    标签: ios iphone swift swift3 swift4


    【解决方案1】:

    只需将此添加到setup 方法

    func setup() {
        backgroundColor = .white
        let stackView = createStackView(views: [emailTextField,passwordTextField])
        addSubview(stackView)
        emailTextField.delegate = self // This
        passwordTextField.delegate = self // And this
    }
    

    然后将其添加到您的 LoginView 类下方

    extension LoginView: UITextFieldDelegate {
        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            if textField == passwordTextField {
                 passwordTextField.resignFirstResponder()
                 doWhatYouWantTo() // eg. do your login
            } else {
                 passwordTextField.becomeFirstResponder()
            }
            return false
        }
    }
    

    扩展答案-

    class LoginController: UIViewController {
        var loginView: LoginView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setupView()
        }
    
        func setupView() {
            let mainView = LoginView(frame: self.view.frame)
            self.loginView = mainView
            self.loginView.delegate = self
            self.view.addSubview(loginView)
        }
    }
    
    extension LoginController: LoginViewDelegate{
        func userWantsToLoginWith(userName: String?, password: String?) {
            // Now you have both userName and password here
        }
    }
    
    protocol LoginViewDelegate: class {
        func userWantsToLoginWith(userName: String?, password: String?)
    }
    
    class LoginView: UIView {
        var delegate: LoginViewDelegate?
    
        let emailTextField: UITextField = {
            let tf = UITextField(placeHolder: "Email")
            return tf
        }()
    
        let passwordTextField: UITextField = {
            let tf = UITextField(placeHolder: "Password")
            tf.isSecureTextEntry = true
            tf.returnKeyType = UIReturnKeyType.send
            return tf
        }()
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            setup()
        }
    
        func setup() {
            backgroundColor = .white
            let stackView = createStackView(views: [emailTextField, passwordTextField])
            addSubview(stackView)
            //autolayout constraints here
        }
    }
    
    extension LoginView: UITextFieldDelegate {
        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            if textField == passwordTextField {
                passwordTextField.resignFirstResponder()
                delegate?.userWantsToLoginWith(userName: emailTextField.text, password: passwordTextField.text)
            } else {
                passwordTextField.becomeFirstResponder()
            }
            return false
        }
    }
    

    【讨论】:

    • 我会编辑答案,然后你会更清楚。
    • 完美,它确实有效。最后一件事,添加 doWhatYouWantTo() 方法的正确位置在哪里?
    • 现在您可以添加LoginView,但理想情况下应该是LoginController。我将添加一些可能对您有所帮助的答案。
    • 简而言之,您应该在 LoginView 中有一个委托,它应该设置为 LoginViewController 因为控制器是应该发生任何操作的地方。
    • 谢谢,我不能在textFieldShouldReturn func下的扩展(扩展LoginView:UITextFieldDelegate)中添加方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2015-06-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多