我使用“返回键”的“下一步”值来获取“下一步”按钮来代替“完成”按钮,但(显然)按下它不会自动移至我 View 中的下一个 UITextField。
正确的做法是什么?我看到了很多答案,但有人有快速的解决方案吗?
最佳答案
确保您的文本字段已设置其委托(delegate)并实现 textFieldShouldReturn
方法。这是当用户点击返回键时调用的方法(无论它看起来像什么)。
该方法可能如下所示:
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField == self.field1 {
self.field2.becomeFirstResponder()
}
return true
}
此处的实际逻辑可能有所不同。有很多方法,如果您有很多文本字段,我绝对建议不要使用庞大的 if
/else
链,但这里的要点是确定 View 是什么当前处于事件状态,以确定哪个 View 应处于事件状态。确定哪个 View 应变为事件状态后,调用该 View 的 becomeFirstResponder
方法。
为了保持代码整洁,您可以考虑使用如下所示的 UITextField
扩展:
private var kAssociationKeyNextField: UInt8 = 0
extension UITextField {
var nextField: UITextField? {
get {
return objc_getAssociatedObject(self, &kAssociationKeyNextField) as? UITextField
}
set(newField) {
objc_setAssociatedObject(self, &kAssociationKeyNextField, newField, .OBJC_ASSOCIATION_RETAIN)
}
}
}
然后将我们的 textFieldShouldReturn
方法更改为如下所示:
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.nextField?.becomeFirstResponder()
return true
}
完成此操作后,只需在 viewDidLoad
中设置每个文本字段的新 nextField
属性即可:
self.field1.nextField = self.field2
self.field2.nextField = self.field3
self.field3.nextField = self.field4
self.field4.nextField = self.field1
<小时/>
不过,如果我们真的想要,我们可以在该属性前添加 @IBOutlet
前缀,这样我们就可以在界面生成器中直接连接“nextField”属性。
将扩展名更改为如下所示:
private var kAssociationKeyNextField: UInt8 = 0
extension UITextField {
@IBOutlet var nextField: UITextField? {
get {
return objc_getAssociatedObject(self, &kAssociationKeyNextField) as? UITextField
}
set(newField) {
objc_setAssociatedObject(self, &kAssociationKeyNextField, newField, .OBJC_ASSOCIATION_RETAIN)
}
}
}
现在在界面生成器中连接 nextField
属性:
(当您也在这里时设置您的代表。)
<小时/>当然,如果 nextField
属性返回 nil
,键盘就会隐藏。
关于ios - 使用 "Next"作为返回键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37285904/