使用"Next"作为返回键

Oct*_*eño 29 uitextfield ios swift

我使用"返回键"的"下一步"值来获取"下一步"按钮代替"完成"按钮,但是(显然)按下它不会自动移动到我视图中的下一个UITextField.

这样做的正确方法是什么?我见过很多答案,但是任何人都有快速解决方案吗?

nhg*_*rif 84

确保您的文本字段设置了其委托并实现该textFieldShouldReturn方法.这是当用户点击返回键时调用的方法(无论它看起来如何).

该方法可能如下所示:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == self.field1 {
        self.field2.becomeFirstResponder()
    }

    return true
}
Run Code Online (Sandbox Code Playgroud)

这里的实际逻辑可能会有所不同.有很多方法,如果你有很多文本字段,我肯定会建议不要使用大型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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将我们的textFieldShouldReturn方法更改为如下所示:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.nextField?.becomeFirstResponder()
    return true
}
Run Code Online (Sandbox Code Playgroud)

完成此操作后,只需将每个文本字段的新nextField属性设置为viewDidLoad:

self.field1.nextField = self.field2
self.field2.nextField = self.field3
self.field3.nextField = self.field4
self.field4.nextField = self.field1
Run Code Online (Sandbox Code Playgroud)

虽然如果我们真的想要,我们可以在属性前加上@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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在nextField在界面构建器中连接属性:

在此输入图像描述

(在你来的时候设置你的代表.)


当然,如果nextField属性返回nil,键盘只是隐藏.

  • 需要这个```objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN```而不是```UInt(OBJC_ASSOCIATION_RETAIN)``` (2认同)

vac*_*ama 8

这是Swift中的一个例子:

我创建了一个6 UITextField秒的屏幕.我在Interface Builder中为它们分配了标签1到6.我还在IB中将Return键更改为Next.然后我实现了以下内容:

import UIKit

// Make your ViewController a UITextFieldDelegate    
class ViewController: UIViewController, UITextFieldDelegate {

    // Use a dictionary to define text field order 1 goes to 2, 2 goes to 3, etc.
    let nextField = [1:2, 2:3, 3:4, 4:5, 5:6, 6:1]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // Make ourselves the delegate of the text fields so that textFieldShouldReturn
        // will be called when the user hits the Next/Return key
        for i in 1...6 {
            if let textField = self.view.viewWithTag(i) as? UITextField {
                textField.delegate = self
            }
        }
    }

    // This is called when the user hits the Next/Return key        
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        // Consult our dictionary to find the next field
        if let nextTag = nextField[textField.tag] {
            if let nextResponder = textField.superview?.viewWithTag(nextTag) {
                // Have the next field become the first responder
                nextResponder.becomeFirstResponder()
            }
        }
        // Return false here to avoid Next/Return key doing anything
        return false
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
Run Code Online (Sandbox Code Playgroud)