以编程方式从子视图快速返回按键事件

Posted

技术标签:

【中文标题】以编程方式从子视图快速返回按键事件【英文标题】: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
()

【问题讨论】:

【参考方案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)中添加方法吗?

以上是关于以编程方式从子视图快速返回按键事件的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式触发 jsdom 窗口中的滚动或按键事件

如何以编程方式控制 NSPopUpButton 上的 TAB 按键事件

Android模拟按键

Ionic实现自定义返回按键事件

如何以编程方式在 ExtJS 4 中触发 keydown 事件

onBackPressed() 监听返回按键事件