Как сделать так, чтобы пользователь мог отключить цифровую клавиатуру в SwiftUI?

У меня есть TextField с числовым вводом:

TextField("Amount", text: amountRaw).keyboardType(.numberPad)

Единственный способ закрыть это поле, который я вижу, — это переместить фокус на нечисловое поле, а затем нажать Enter в этом поле. Это не идеально.

Нет ли способа включить кнопку отклонения клавиатуры или что-то в этом роде?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
96
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Убедитесь, что ваше текстовое поле находится внутри ScrollView, Form или List, и украсьте этот контейнер .scrollDismissesKeyboard(.interactively). Это позволяет провести пальцем по экрану или перетащить вниз, чтобы закрыть клавиатуру.

Хм... это не удивительно, но, думаю, это лучше того, что у меня есть.

boxed 04.04.2024 21:32

На практике это выглядит намного лучше, чем я ожидал. Спасибо!

boxed 04.04.2024 21:41

Вы можете использовать силу @FocusState

import SwiftUI

struct ContentView: View {
    
    enum FocusedField {
            case amount, name
        }
    
    @State private var amountRaw = ""
    @State private var name = ""
    @FocusState private var focusedField: FocusedField?
    
    var body: some View {
        VStack {
            TextField("Amount", text: $amountRaw)
                .keyboardType(.numberPad)
                .focused($focusedField, equals: .name)
            
            TextField("Name", text: $name)
                .focused($focusedField, equals: .name)
        }
        .textFieldStyle(.roundedBorder)
        .padding()
    }
}

#Preview {
    ContentView()
}

Я совсем не это спросил.

boxed 04.04.2024 21:31

Вы можете использовать состояние фокуса (в данном случае «@FocusState var isFocused: Bool») и переключать его с помощью кнопки «Готово», кнопку «Готово» можно добавить как ToolbarItem:

.keyboardType(.decimalPad)
.toolbar {
    ToolbarItemGroup(placement: .keyboard) {
        Spacer()
        Button("Done") {
            isFocused = false
        }
        .fontWeight(.bold)
    }
}

и вы получите что-то вроде этого Изображение

Спасибо! Это не совсем правильно, так как не обеспечивает четкое масштабирование, но панель инструментов была последним ключом к разгадке.

boxed 06.04.2024 13:00
Ответ принят как подходящий

Собрав воедино ответ от @rob-mayoff, @user24018863 и https://www.hackingwithswift.com/quick-start/swiftui/how-to-dismiss-the-keyboard-for-a-textfield я получил хорошее решение:

.scrollDismissesKeyboard(.interactively)

С точки зрения содержания это приятно иметь. А потом:

TextField("money", value: $saveTarget, formatter: NumberFormatter())
.keyboardType(.numberPad)
.toolbar {
    ToolbarItemGroup(placement: .keyboard) {
        Spacer()
        Button("Done") {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
        }
        .fontWeight(.bold)
    }
}

обратите внимание, что модификацию .toolbar необходимо внести в представление верхнего уровня. Если применить ко многим полям (например, в ForEach), вы получите кнопку на панели инструментов несколько раз.

Другие вопросы по теме