ios - 使用 "Next"作为返回键

标签 ios swift uitextfield

我使用“返回键”的“下一步”值来获取“下一步”按钮来代替“完成”按钮,但(显然)按下它不会自动移至我 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 属性:

enter image description here

(当您也在这里时设置您的代表。)

<小时/>

当然,如果 nextField 属性返回 nil,键盘就会隐藏。

关于ios - 使用 "Next"作为返回键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37285904/

相关文章:

ios - 分割 View 中主视图的后退导航不适用于显示模式 "Auto"或 "primaryHidden"

ios - Storyboard中设置的 UITableViewCell 的恢复 ID 和标识符之间有什么区别

ios - 可以导入 RealmSwift,不能实例化

ios - iOS 上的 OpenGL ES 1.1 : No clipping planes?

ios - GPUImage:2个分支链的同步

ios - 如何在 Swift 中使用正则表达式将匹配表达式替换为模板字符串而不是纯文本

iphone - 如果用户点击屏幕键盘,我如何关闭键盘?

objective-c - objective-c (math.h) 中的 tan ( pi/2 ) 不是未定义的

iOS/swift : Can't assign optional String to UILabel text property

ios - 需要检查 UITextField 是否包含两个(并且只有两个)iOS 中每个最少 2 个字符的字符串