web-dev-qa-db-ja.com

SwiftのUITextViewで[戻る]ボタンの機能を[完了]に変更します

ユーザーが入力している間、キーボードの「return」機能を削除したいので、新しい行はないので、代わりに「return」キーを「Done」として機能させて、キーボードを非表示にします。

編集可能なUITextViewを使用しているため、ユーザーは投稿を入力してメインタイムラインに投稿できますが、セルが固定されているため、ユーザーが「return」キーを押したくない彼らの投稿はタイムラインの範囲外になります。

私はこれをUITextFieldで動作しますが、UITextViewでは動作しませんでした:

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    textField.resignFirstResponder()  //if desired
    return true
}

したがって、UITextViewでそれを行う方法があるかどうか、または少なくとも改行を作成する代わりにReturnキーを押した場合にキーボードを非表示にできる方法があるかどうかを知りたかっただけです。

36
Bruno Recillas

テキストフィールドのリターンキータイプを設定できます。

textField.returnKeyType = UIReturnKeyType.Done

更新上記のように、確実に同じアプローチを使用してリターンキーを「完了」に設定できます。ただし、ユーザーがReturnキーを押したときにUITextViewはコールバックを提供しません。回避策として、textView(textView:UITextView、shouldChangeTextInRange range:NSRange、replacementText text:String)デリゲート呼び出しを処理し、改行文字の入力を検出するとキーボードを閉じることができます:

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

私は多くのコードを試しましたが、最終的にはSwift 3.0最新[2019年4月]これはUITextFieldsを使用して達成されました

このコードを機能させるには、「ViewController」クラスに「UITextFieldDelegate」を継承する必要があります。

class ViewController: UIViewController,UITextFieldDelegate  

適切なタグ番号を持つテキストフィールドを追加します。このタグ番号は、割り当てられた増分タグ番号に基づいて適切なテキストフィールドに制御を移すために使用されます。

override func viewDidLoad() {

    userNameTextField.delegate = self
    userNameTextField.tag = 0
    userNameTextField.returnKeyType = .next
    passwordTextField.delegate = self
    passwordTextField.tag = 1
    passwordTextField.returnKeyType = .go
}

上記のコードでは、「returnKeyType = UIReturnKeyType.next」でキーパッドのリターンキーを「Next」として表示し、アプリケーションに基づいて値を変更する「Join/Go」などのオプションもあります。

この「textFieldShouldReturn」は、UITextFieldDelegateによって制御されるメソッドであり、タグ値の増分に基づいた次のフィールド選択があります。

func textFieldShouldReturn(_ textField: UITextField) -> Bool
{
    if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
        nextField.becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
        return true;
    }
    return false
}

ストーリーボードまたはxibを使用している場合は、セットアップコードを必要とせずに、Interface Builder内で_UITextView's_ Returnボタンを「完了」(またはその他のさまざまなオプション)に変更できます。 Attributesインスペクターでこのオプションを探してください:

Return Key option in Interface Builder

そこから、他の人がすでにここで提供しているUITextViewDelegateコードとペアにします。

Swift v5:

_extension ExampleViewController: UITextViewDelegate {

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

そして、viewDidLoad()メソッドで:

_exampleTextView.delegate = self_

1
TheNeil

Working in Swift 4

これをviewDidLoad()に追加します。

textField.returnKeyType = UIReturnKeyType.Done

これを好きな場所に追加します。

extension UITextView: UITextViewDelegate {
    public func textViewDidChange(_ textView: UITextView) {
        if text.last == "\n" { //Check if last char is newline
            text.removeLast() //Remove newline
            textView.resignFirstResponder() //Dismiss keyboard
        }
    }
}
0
Erik Nguyen