背景
我有两个TextField
,其中一个的键盘类型为.decimalPad
。
鉴于使用十进制小键盘关闭时没有“完成”按钮,而不是像标准键盘的回车键,我想在SwiftUI中的键盘 * 上方的工具栏中添加一个“完成”按钮,仅用于十进制键盘 *。
问题
由于某种原因,将.toolbar
* 添加到任何TextField
* 会将其添加到所有TextField
!我尝试过条件修饰符,使用焦点状态并检查Field
值(但由于某种原因,检查时没有设置它,可能是排序问题?),但它仍然会为两个TextField
添加键盘上方的工具栏。
我怎么可能只有一个接受数字的TextField
,而另一个接受字符串的TextField
没有.toolbar
呢?
编号
- 请注意,我试着做了一个最小的例子,你可以直接复制并粘贴到Xcode中,然后自己运行它。对于Xcode 13.2,在显示
TextField
s的键盘方面有一些问题,特别是在一个表单中,所以可能需要模拟器来正确运行它,并使用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()
}
}
6条答案
按热度按时间7gyucuyw1#
尝试使工具栏内容有条件并将工具栏移出,如下所示。(现在不可能测试-只是想法)
注:在真实的器械上进行测试
ybzsozfc2#
使用introspect,您可以在View的任何部分执行类似的操作:
以及对于
getKeyboardToolbar
:对于
CustomBarButtonItem
,这是一个条形按钮项,它采用闭包ubof19bj3#
我试了很多次,但最后还是在下面的一个。
rlcwz9us4#
这就是我的解决方案:
对于我的项目,我在一个View上有五个
TextField
视图,所以我在View的扩展中创建了这个方法。我传递了唯一的
FocusState<Bool>.Binding
值,并在ToolbarItemGroup闭包中使用它来确定是否应该显示内容(Spacer、Button)。如果特定的TextField是focused
,则显示工具栏内容(所有其他非焦点TextField都不会显示)。kwvwclae5#
我发现将每个
TextField
Package 在它自己的NavigationView
中会给每个TextField
提供它自己的上下文,因此会有一个唯一的工具栏。感觉不太对,我在控制台中看到了约束警告。使用如下内容:5jdjgkvh6#
有工作。但其他TextField仍会显示工具列。
--- update ---嗨,我更新了代码以使用ViewModifier,使代码更易于使用,这次代码确实编译并运行〉_〈
---老---
with Donewith Toolbarwithout