1

a 、 a 、および aをSwiftUI Form含む a があります。PickerTextFieldText

struct ContentView: View {

    var body: some View {
        Form {
            Section {
                Picker(selection: $selection, label: label) {
                    // Code to populate picker
                }.pickerStyle(SegmentedPickerStyle())
                HStack {
                    TextField(title, text: $text)
                    Text(text)
                }
            }
        }
    }

}

上記のコードは、次の UI になります。

ピッカーとラベル付きのテキスト フィールドを表示する iOS アプリケーションのスクリーンショット

以下に示すように、ピッカーで 2 番目の項目を簡単に選択できます。

ピッカーで更新された選択を表示する iOS アプリケーションのスクリーンショット

以下では、 をタップしてテキスト入力を開始できることがわかりますTextField

テキスト フィールドにテキスト入力用のキーボードを表示する iOS アプリケーションのスクリーンショット

Picker値が更新されたときにキーボードを閉じるために、Bindingが追加されました。これは、次のコード ブロックで確認できます。

Picker(selection: Binding(get: {
        // Code to get selected segment
    }, set: { (index) in
        // Code to set selected segment
        self.endEditing()
    }), label: label) {
        // Code to populate picker
    }

への呼び出しself.endEditing()は、次のメソッドで提供されます。

func endEditing() {
    sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}

次のスクリーンショットは、キーボードの別のセグメントを選択するとPickerキーボードが消えることを示しています。

ピッカーの新しいセグメントを選択するときに閉じられたキーボードを表示する iOS アプリケーションのスクリーンショット

この時点まで、すべてが期待どおりに機能します。ただし、スクロールビューを含むをTextFieldドラッグするときにキーボードを閉じる方法がわからないため、の外側をタップするとキーボードを閉じたいと思います。Form

をタップしたときにキーボードを閉じるために、次の実装を追加しようとしましたForm

Form {
    Section {
        // Picker
        HStack {
            // TextField
            // Text
        }
    }
}.onTapGesture {
    self.endEditing()
}

以下の 2 つのスクリーンショットは、TextFieldがファーストレスポンダーになり、キーボードを表示できることを示しています。の外側をタップすると、キーボードが正常に閉じられTextFieldます。

テキストフィールドをタップした後に表示されるキーボードを表示する iOS アプリケーションのスクリーンショット

ただし、ピッカーの別のセグメントを選択しようとしても、キーボードは消えません。実際、キーボードを閉じた後でも、別のセグメントを選択することはできません。フォームに添付されたタップジェスチャが選択を妨げているため、別のセグメントを選択できないと思います。

Picker次のスクリーンショットは、キーボードが表示され、タップ ジェスチャが実装されている間にで 2 番目の値を選択しようとした結果を示しています。

表示されたキーボードと以前に選択したピッカー セグメントを表示する iOS アプリケーションのスクリーンショット

Pickerの外側をタップしたときにキーボードを閉じることができるようにしながら、 のセグメントを選択できるようにするにはどうすればよいTextFieldですか?

4

2 に答える 2