У меня есть TextField с числовым вводом:
TextField("Amount", text: amountRaw).keyboardType(.numberPad)
Единственный способ закрыть это поле, который я вижу, — это переместить фокус на нечисловое поле, а затем нажать Enter в этом поле. Это не идеально.
Нет ли способа включить кнопку отклонения клавиатуры или что-то в этом роде?
Я нашел людей, предлагающих такие решения, как реализация щелчка снаружи для отключения клавиатуры, но это не совсем то, что мне нужно, поскольку я хочу, чтобы щелчок по другим текстовым полям работал.





Убедитесь, что ваше текстовое поле находится внутри ScrollView, Form или List, и украсьте этот контейнер .scrollDismissesKeyboard(.interactively). Это позволяет провести пальцем по экрану или перетащить вниз, чтобы закрыть клавиатуру.
На практике это выглядит намного лучше, чем я ожидал. Спасибо!
Вы можете использовать силу @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()
}
Я совсем не это спросил.
Вы можете использовать состояние фокуса (в данном случае «@FocusState var isFocused: Bool») и переключать его с помощью кнопки «Готово», кнопку «Готово» можно добавить как ToolbarItem:
.keyboardType(.decimalPad)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()
Button("Done") {
isFocused = false
}
.fontWeight(.bold)
}
}
и вы получите что-то вроде этого Изображение
Спасибо! Это не совсем правильно, так как не обеспечивает четкое масштабирование, но панель инструментов была последним ключом к разгадке.
Собрав воедино ответ от @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), вы получите кнопку на панели инструментов несколько раз.
Хм... это не удивительно, но, думаю, это лучше того, что у меня есть.