web-dev-qa-db-ja.com

SwiftUI-キーボードのReturnボタンをクリックしてTextFieldをナビゲートする方法

私はSwiftUIのTextField View。主に2つの質問があります、

1)Swiftでは、Return Key(Text Input Traits)to Next for TextField from Storyboard from likeこれでしょ?このため、SwiftUIでどの修飾子を使用しますか?

enter image description here

2)2つのTextfieldがあります。キーボードからReturn/nextボタンをクリックしたときに次のTextFieldに移動するにはどうすればよいですか?

誰かがこれで、またはこの機能を実行するための他の代替案で手助けできますか?

私の質問はSwiftUIに関するもので、UIKitのものではありません:)

どんな助けでも大歓迎です!!

11
Anjali Kevadiya

2つの問題を解決するには、UIKitfromSwiftUIを使用する必要があります。まず、UIViewRepresentableを使用してTextFieldをカスタマイズする必要があります。コードはそれほどエレガントではありませんが、ここにテスト目的のサンプルコードがあります。きっと、もっと強力な解決策があるでしょう。

  1. カスタマイズされたTextFieldType内で、キーボードの戻り値の型が設定されています。
  2. オブジェクトバインディングとデリゲートメソッドtextFieldShouldReturnを使用することにより、Viewはバインディング変数を更新してキーボードにフォーカスできます。

これがサンプルコードです:

import SwiftUI

struct KeyboardTypeView: View {
    @State var firstName = ""
    @State var lastName = ""
    @State var focused: [Bool] = [true, false]

    var body: some View {
        Form {
            Section(header: Text("Your Info")) {
                TextFieldTyped(keyboardType: .default, returnVal: .next, tag: 0, text: self.$firstName, isfocusAble: self.$focused)
                TextFieldTyped(keyboardType: .default, returnVal: .done, tag: 1, text: self.$lastName, isfocusAble: self.$focused)
                Text("Full Name :" + self.firstName + " " + self.lastName)
            }
        }
}
}



struct TextFieldTyped: UIViewRepresentable {
    let keyboardType: UIKeyboardType
    let returnVal: UIReturnKeyType
    let tag: Int
    @Binding var text: String
    @Binding var isfocusAble: [Bool]

    func makeUIView(context: Context) -> UITextField {
        let textField = UITextField(frame: .zero)
        textField.keyboardType = self.keyboardType
        textField.returnKeyType = self.returnVal
        textField.tag = self.tag
        textField.delegate = context.coordinator
        textField.autocorrectionType = .no

        return textField
    }

    func updateUIView(_ uiView: UITextField, context: Context) {
        if isfocusAble[tag] {
            uiView.becomeFirstResponder()
        } else {
            uiView.resignFirstResponder()
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UITextFieldDelegate {
        var parent: TextFieldTyped

        init(_ textField: TextFieldTyped) {
            self.parent = textField
        }

        func updatefocus(textfield: UITextField) {
            textfield.becomeFirstResponder()
        }

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

            if parent.tag == 0 {
                parent.isfocusAble = [false, true]
                parent.text = textField.text ?? ""
            } else if parent.tag == 1 {
                parent.isfocusAble = [false, false]
                parent.text = textField.text ?? ""
         }
        return true
        }

    }
}

出力: enter image description here

9
Razib Mollick

できません。SwiftUIにはまだレスポンダーチェーンの概念がありません。 Viewは実際にはビュー自体ではなく、ビューの設定方法を説明する構造体にすぎないため、プログラムでフォーカスを開始することはできません。私の推測では、最終的にはEnvironmentValues(行の切り捨て、自動修正など)を介して公開される可能性がありますが、現在は存在しません。

0
Procrastin8