背景
我有两个TextField
,其中一个的键盘类型是.decimalPad
。
考虑到在使用十进制小数键盘时没有“完成”按钮来关闭它,而是像标准键盘的返回键一样,我想在SwiftUI中为十进制小数键盘上方的工具栏中添加一个“完成”按钮,仅适用于小数键盘。
问题
将.toolbar
添加到任何TextField
都会将其添加到所有TextField
中! 我尝试过条件修饰符,使用焦点状态以及检查字段值(但由于某些原因,当检查时它未设置,可能是由于排序问题?),但它仍会为两个TextField
添加工具栏。
我如何仅为接受数字的单个TextField
添加.toolbar
,而不是其他接受字符串的TextField
?
代码
请注意,我尝试制作了一个最小化的示例,您可以将其复制并粘贴到Xcode中并运行。 对于我来说,在Xcode 13.2中显示TextField
键盘存在一些问题,特别是在对话框中,因此可能需要模拟器才能正确运行并使用cmd+K带来键盘。
import SwiftUI
struct TestKeyboard: View {
@State var str: String = ""
@State var num: Float = 1.2
@FocusState private var focusedField: Field?
private enum Field: Int, CaseIterable {
case amount
case str
}
var body: some View {
VStack {
Spacer()
// I'm not adding .toolbar here...
TextField("A text field here", text: $str)
.focused($focusedField, equals: .str)
// I'm only adding .toolbar here, but it still shows for the one above..
TextField("", value: $num, formatter: FloatNumberFormatter())
.keyboardType(.decimalPad)
.focused($focusedField, equals: .amount)
.toolbar {
ToolbarItem(placement: .keyboard) {
Button("Done") {
focusedField = nil
}
}
}
Spacer()
}
}
}
class FloatNumberFormatter: NumberFormatter {
override init() {
super.init()
self.numberStyle = .currency
self.currencySymbol = "€"
self.minimumFractionDigits = 2
self.maximumFractionDigits = 2
self.locale = Locale.current
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
// So you can preview it quickly
struct TestKeyboard_Previews: PreviewProvider {
static var previews: some View {
TestKeyboard()
}
}
toolbar
的工作方式。有一些关于如何向键盘添加一个应该做你想要的事情的按钮的 iOS 15 之前的教程。请参见此答案。 - YrbNumberFormatter
不起作用,而且视图占据了屏幕的其余部分。它的行为不像我期望的那样。我还有什么遗漏的吗?代码。PS-再次感谢您的回复! - JimbonumberFormatter.string(from: NSNumber(value: value))!
。但是然后你可以删除符号。我觉得与我尝试使用iOS 15特定的SwiftUI功能相比,这相当于一个hack。 - Jimbo