Отключение клавиатуры в SwiftUI: нажатие снаружи, чтобы закрыть

Привет, коллега-разработчик SwiftUI! Сегодня мы собираемся углубиться в общую задачу: отключение клавиатуры, когда пользователь нажимает за пределами поля ввода текста. Это удобная функция, которая может значительно улучшить взаимодействие с пользователем в вашем приложении. Итак, давайте рассмотрим несколько методов, которые помогут вам добиться этого в ваших проектах SwiftUI.

Метод 1: использование UIResponder

Один из способов отказаться от клавиатуры — использовать класс UIResponder, который является суперклассом UIApplication и UIView. В представлении SwiftUI вы можете переопределить метод touchesBegan(_:with:) UIResponder, чтобы определять, когда пользователь нажимает за пределами поля ввода текста. Вот пример того, как это можно реализовать:

struct ContentView: View {
    @State private var text: String = ""
    var body: some View {
        VStack {
            TextField("Enter text", text: $text)
                .padding()
                .background(Color.gray)
                .cornerRadius(5.0)
                .onTapGesture {
                    // Dismiss the keyboard
                    UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
                }
        }
        .padding()
    }
}

В этом фрагменте кода мы присоединяем модификатор onTapGestureк TextFieldи вызываем UIApplication.shared.sendAction(_:to:from:for:)для отправки resignFirstResponderдействие. Это действие сообщает первому ответчику (в данном случае текстовому полю) отказаться от своего статуса, что фактически отключает клавиатуру.

Метод 2: использование пользовательского модификатора SwiftUI

Другой подход — создать собственный модификатор SwiftUI, который инкапсулирует поведение отключения клавиатуры. Это позволяет вам легко повторно использовать модификатор в нескольких полях ввода текста в вашем приложении. Вот пример:

Content) ->some View {
content
.onTapGesture {
// Отключить клавиатуру
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, от : nil, for: nil)



расширение View {
func DisclaimKeyboardOnTapOutside() ->some View {
self.modifier(DismissKeyboardOnTapOutside())

С помощью этого пользовательского модификатора вы можете легко отключить клавиатуру, применив модификатор dismissKeyboardOnTapOutside()к полям ввода текста. Вот пример использования:

struct ContentView: View {
    @State private var text: String = ""
    var body: some View {
        VStack {
            TextField("Enter text", text: $text)
                .padding()
                .background(Color.gray)
                .cornerRadius(5.0)
                .dismissKeyboardOnTapOutside()
        }
        .padding()
    }
}

Метод 3: использование координатора

Последний метод предполагает использование координатора, который является мостом между SwiftUI и UIKit. Реализуя методы UITextFieldDelegateв координаторе, вы можете обнаружить, когда пользователь нажимает за пределами текстового поля, и отказаться от первого ответчика. Вот пример:

struct ContentView: View {
    @State private var text: String = ""
    var body: some View {
        VStack {
            TextField("Enter text", text: $text, onEditingChanged: { _ in }, onCommit: {})
                .padding()
                .background(Color.gray)
                .cornerRadius(5.0)
                .introspectTextField { textField in
                    textField.delegate = context.coordinator
                }
        }
        .padding()
        .onAppear {
            // Create the coordinator
            let coordinator = Coordinator()
            // Set the coordinator in the environment
            context.coordinator = coordinator
        }
    }
}
class Coordinator: NSObject, UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        // No implementation required
    }
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // Dismiss the keyboard when the Return key is tapped
        textField.resignFirstResponder()
        return true
    }
}

В этом примере мы используем функцию introspectTextFieldиз библиотеки Introspect, чтобы получить доступ к базовому UITextFieldи назначить ее делегатом нашему координатору. Затем координатор обрабатывает отключение клавиатуры, реализуя метод textFieldShouldReturn(_:).

И вот оно! Мы рассмотрели три различных метода отключения клавиатуры в SwiftUI, когда пользователь нажимает за пределами поля ввода текста. Каждый подход имеет свои преимущества и может использоваться в зависимости от ваших конкретных требований. Теперь приступайте к реализации этих методов в своих проектах SwiftUI, чтобы обеспечить более удобный пользовательский интерфейс.