Как скрыть клавиатуру в форме выбора SwiftUI? - PullRequest
1 голос
/ 22 октября 2019

У меня есть SwiftUI Form, который содержит Picker, TextField и Text:

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)
                }
            }
        }
    }

}

Приведенный выше код приводит к следующему пользовательскому интерфейсу:

Screenshot of iOS application that displays a picker and a text field with a label

Я могу легко выбрать второй элемент в сборщике, как показано ниже:

Screenshot of iOS application that displays an updated selection in the picker

Ниже вы можете увидеть, что я могу начать ввод текста, нажав TextField:

Screenshot of iOS application that displays keyboard for text entry in text field

InЧтобы закрыть клавиатуру при обновлении значения 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 клавиатура отклоняется:

Screenshot of iOS application that displays dismissed keyboard when selecting new segment of picker

До этого момента все работает как положено. Тем не менее, я хотел бы отклонить клавиатуру при нажатии в любом месте за пределами TextField, так как не могу понять, как отключить клавиатуру при перетаскивании Form содержащего прокрутки вида.

Я попыталсяЧтобы добавить следующую реализацию для отклонения клавиатуры при нажатии на Form:

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

Ниже на следующих двух снимках экрана показано, что TextField может стать первым респондентом и отображать клавиатуру. Клавиатура будет успешно отклонена при нажатии за пределы TextField:

Screenshot of iOS application that displays displayed keyboard after tapping text field

Однако клавиатура не будет закрываться при попытке выбрать другой сегментсборщика. На самом деле, я не могу выбрать другой сегмент, даже после того, как клавиатура была отклонена. Я предполагаю, что другой сегмент не может быть выбран, потому что жест касания, прикрепленный к форме, мешает выбору.

На следующем снимке экрана показан результат попытки выбрать второе значение в Picker, когда клавиатураи жест касания реализован:

Screenshot of iOS application that displays displayed keyboard and previously-selected picker segment

Что можно сделать, чтобы разрешить выбор сегментов Picker, при этом позволяя клавиатуре бытьуволен при нажатии за пределами TextField?

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете поместить весь свой код в VStack {code}, добавить к нему Spacer () и добавить onTap к этому VStack. Это позволит вам отклонить клавиатуру, щелкнув в любом месте экрана.

См. Код ниже:

import SwiftUI

struct ContentView: View {

        @State private var text: String = "Test"

        var body: some View {
            VStack {
                HStack {
                    TextField("Hello World", text: $text)
                    Spacer()
                }
                Spacer()
            }
            .background(Color.red)
            .onTapGesture {
                self.endEditing()
            }
        }

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

Изменение цвета фона HStack или VStack на красный упрощает определение, где пользователь может щелкнуть, чтобы отклонить.

Копирование и вставкакод готового к запуску примера.

...