SwiftUI - Отключить клавиатуру, когда выбран инструмент выбора - PullRequest
1 голос
/ 31 октября 2019

Существуют ли простые средства для отмены клавиатуры или любого другого активного элемента управления, когда становится активным другой элемент управления, например средство выбора даты? Или наоборот.

Существуют некоторые решения для отклонения клавиатуры, но также запрещающие использование средства выбора.

Возможно, существует событие, отличное от onTapGesture, для использования.

Ниже приведен пример кода, иллюстрирующий проблему.

struct TestView: View {

    @State private var firstname = ""
    @State private var surname = ""
    @State private var birthdate = Date()

    @State private var activeField: Int = 0



    var body: some View {
        Form {
            Section{
                TextField("Firstname", text: self.$firstname)
                TextField("Surname", text: self.$surname)

                TextField("Surname", text: self.$surname, onEditingChanged: { (editingChanged) in
                           if editingChanged {
                               print("TextField focused")
                           } else {
                               print("TextField focus removed")
                            self.endEditing()
                           }
                       })
            }

            Section(header: Text("Time: ")){

                DatePicker(selection: self.$birthdate, in: ...Date(), displayedComponents: .date) {
                    Text("Date of Birth")
                }
                .onTapGesture {
                   self.endEditing()
                }
                DatePicker(selection: self.$birthdate, in: ...Date(), displayedComponents: .hourAndMinute) {
                    Text("Date of Birth")
                }
            }
        }


    }

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

        let keyWindow = UIApplication.shared.connectedScenes
                               .filter({$0.activationState == .foregroundActive})
                               .map({$0 as? UIWindowScene})
                               .compactMap({$0})
                               .first?.windows
                               .filter({$0.isKeyWindow}).first
                       keyWindow?.endEditing(true)

    }
}

1 Ответ

0 голосов
/ 02 ноября 2019

Помимо onTapGesture, вы можете добавить onAppear. Это решает ваши проблемы

    DatePicker(selection: self.$birthdate, in: ...Date(), displayedComponents: .date) {

                    Text("Date of Birth")

            }
            .onAppear{self.endEditing()}
            .onTapGesture{self.endEditing()}
...