以编程方式从子视图快速返回按键事件
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)中添加方法吗?以上是关于以编程方式从子视图快速返回按键事件的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式控制 NSPopUpButton 上的 TAB 按键事件