SwiftUI отклоняет клавиатуру при нажатии segmentedControl - PullRequest
2 голосов
/ 12 октября 2019

У меня есть TextField в SwiftUI, который должен использовать другую клавиатуру в зависимости от значения переменной @State, определенной с помощью средства выбора SegementedControl ().

Как я могу отклонить клавиатуру (например, отправить endEditingсобытие) когда пользователь касается другого сегмента? Мне нужно сделать это, потому что я хочу изменить тип клавиатуры, и если textField является респондентом, клавиатура не изменится.

У меня есть это расширение:

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

И яможет сделать что-то вроде

UIApplication.shared.endEditing()

Но я не знаю, где и как это вызвать, когда пользователь нажимает на другой сегмент.

Я попытался поместить tapGesture на Picker иклавиатура не отключается, но касание не проходит к средству выбора, поэтому оно не изменяется.

Фрагмент кода здесь:

@State private var type:String = "name"

. ,.

Form {
    Section(header: Text("Search Type")) {
        Picker("", selection: $type) {
            Text("By Name").tag("name")
            Text("By AppId").tag("id")
        }.pickerStyle(SegmentedPickerStyle())
    }

    Section(header: Text("Enter search value")) {
        TextField(self.searchPlaceHolder, text: $searchValue)
            .keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
    }
}

1 Ответ

1 голос
/ 12 октября 2019

Присоедините пользовательский Binding к Picker, который вызывает endEditing() всякий раз, когда он установлен:

Section(header: Text("Search Type")) {
    Picker("", selection: Binding(get: {
        self.type
    }, set: { (res) in
        self.type = res
        UIApplication.shared.endEditing()
    })) {
        Text("By Name").tag("name")
        Text("By AppId").tag("id")
    }.pickerStyle(SegmentedPickerStyle())
}
...