我使用“返回键”的“下一步”值来获取“下一步”按钮代替“完成”按钮,但是(显然)按下它不会自动移动到我视图中的下一个UITextField. 这样做的正确方法是什么?我见过很多答案,但
这样做的正确方法是什么?我见过很多答案,但是任何人都有快速解决方案吗?
确保您的文本字段设置了其委托,并实现textFieldShouldReturn方法.这是当用户点击返回键时调用的方法(无论它看起来如何).该方法可能如下所示:
func textFieldShouldReturn(textField: UITextField) -> Bool { if textField == self.field1 { self.field2.becomeFirstResponder() } return true }
这里的实际逻辑可能会有所不同.有很多方法,如果你有很多文本字段,我肯定会建议不要使用大量的if / else链,但这里的要点是确定当前活动的视图以确定哪个视图应该变为活动状态.一旦确定哪个视图应该变为活动状态,请调用该视图的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,键盘只会隐藏.