Swift下一步按钮更改文本字段

4
我有一个用Swift和iOS8构建的应用程序。在我的ViewController中,我有两个文本字段。 我使用以下代码:
func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == self.textfield_A {
        self.textfield_B.becomeFirstResponder()
    }
    if textField == self.textfield_B {
        self.textfield_B.resignFirstResponder()
    }
    return true
}

效果:
我选择 textfield_A 并按下 下一步按钮 -> 光标跳到 textfield_Btextfield_B 上,我按下 完成按钮 -> 键盘将被隐藏。
所有都正常工作。
但现在我做了一个更改,代码不再像这样工作。
我把 textfield_A 改成了 textView
您有什么想法如何修改我的代码?

3
"textField" 和 "textView" 是不同的。 - Dharmesh Kheni
textfield代理...不会被textview调用。它们是两个不同的类,有不同的协议。 - Sujith Chandran
6个回答

10

你需要添加一个扩展,这是适用于Swift 3.0 的扩展。

extension UITextField {
class func connectFields(fields:[UITextField]) -> Void {
    guard let last = fields.last else {
        return
    }
    for i in 0 ..< fields.count - 1 {
        fields[i].returnKeyType = .next
        fields[i].addTarget(fields[i+1], action: #selector(UIResponder.becomeFirstResponder), for: .editingDidEndOnExit)
    }
    last.returnKeyType = .done
    last.addTarget(last, action: #selector(UIResponder.resignFirstResponder), for: .editingDidEndOnExit)
    }
} 

并且在您添加这行代码之后:

UITextField.connectFields(fields: [field1, field2, field3])

5
现在,对于textfield_A来说,textFieldShouldReturn将不再被调用,因为现在它是一个文本视图,而不是一个文本字段。尝试添加这个函数:
func textView(textView: UITextView!, shouldChangeTextInRange: NSRange, replacementText: NSString!) -> Bool {
    if(replacementText == "\n") {
        textView.resignFirstResponder()
        return false
    }
    return true
}

1
如果您同时使用文本框,则以下代码可能对您有所帮助。
确保您的文本字段已设置委托并实现textFieldShouldReturn方法。 当用户点击回车键时(无论其外观如何),就会调用此方法。
该方法可能如下所示:
func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == self.field1 {
        self.field2.becomeFirstResponder()
    }

    return true
}

不要忘记给委托。
TextField.delegate = self

1
请仔细阅读整个问题。代码运行良好,但 OP 将文本字段更改为文本视图。 - Ashish Kakkad
需要使用另一个textView吗? - Mehul
这不是强制性的,但你必须根据OP的问题回答。 - Ashish Kakkad

0

使用textField,你可以通过textFieldShouldReturn:方法检测回车键。 textView是一个多行输入框,所以回车键只会添加一个新行,所以最简单的捕获回车键的方法是实现UITextViewDelegate方法:

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

0

在你的doneButton操作中,你可以这样做:

@IBAction func donePressed(sender: AnyObject) {

    if textV.resignFirstResponder() {      //check if cursor is at textView.
        textfield_B.becomeFirstResponder() //move it to your next textField.
    } else  {         
        textfield_B.resignFirstResponder() //else hide your keyboard.
    }
}

你的结果将会是:

enter image description here

希望能有所帮助。


0

Swift 4.2

这是一个更通用的解决方案,您可以使用此代码处理任意数量的文本字段。 只需继承UITextFieldDelegate并根据顺序更新Textfield Tag即可。

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let txtTag:Int = textField.tag

    if let textFieldNxt = self.view.viewWithTag(txtTag+1) as? UITextField {
        textFieldNxt.becomeFirstResponder()
    }else{
        textField.resignFirstResponder()
    }

    return true
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接