SwiftUI 改变每个 TextField 的键盘类型
SwiftUI Changing KeyboardType Per TextField
我有多个 TextField,对于其中一个,我需要将 keyboardType 切换为 .numberPad。显然,使用 .keyboardType(.numberPad) 修饰符真的很容易,但问题是当默认键盘已经显示时,它不会关闭然后调出 numberPad。相反,它只是立即切换,这导致用户必须手动向上滑动才能看到他们将在其中输入数字的 TextField。
我需要做的是完全关闭默认键盘,然后显示 numberPad,以便将正确的 TextField 推送到屏幕上。
我已经为 numberField TextField 尝试了各种修饰符,例如:
.onAppear {
isFocused = nil
isFocused = .numberField
}
.onAppear {
isFocused = nil
sleep(1)
isFocused = .numberField
}
.focused($isFocused, equals: nil)
.keyboardType(.numberPad)
.focused($isFocused, equals: .numberField)
None 工作。键盘切换,但屏幕没有滚动到正确的字段。
由于这是一个多字段表单,我使用提交按钮在字段之间切换,如下所示:
TextField("", text: $field1)
.focused($isFocused, equals: .field1)
.keyboardType(.default)
.onSubmit {
if isFocused == .field1 {
isFocused = .numberField
}
}
.submitLabel(.next)
TextField("", text: $numberField)
.focused($isFocused, equals: .numberField)
.keyboardType(.numberPad)
如果我手动关闭 field1 的默认键盘,然后点击 numberField TextField,则 numberPad 出现并且该字段正确聚焦。因此,我需要以某种方式自动关闭默认键盘,然后显示 numberPad,以便为用户在屏幕上显示正确的字段。
为了关闭现有键盘然后显示新类型的键盘,同时保持键盘避免并专注于正确的 TextField,您需要按如下方式使用 DispatchQueue:
TextField("", text: $field1)
.focused($isFocused, equals: .field1)
.keyboardType(.default)
.onSubmit {
if isFocused == .field1 {
isFocused = nil
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
isFocused = .numberField
}
}
}
通过使用 DispatchQueue,您允许应用保持 运行,同时完全关闭键盘,等待 x 秒(在我的示例中是 0.3 秒,感觉非常瞬间),然后调出新键盘。
我有多个 TextField,对于其中一个,我需要将 keyboardType 切换为 .numberPad。显然,使用 .keyboardType(.numberPad) 修饰符真的很容易,但问题是当默认键盘已经显示时,它不会关闭然后调出 numberPad。相反,它只是立即切换,这导致用户必须手动向上滑动才能看到他们将在其中输入数字的 TextField。
我需要做的是完全关闭默认键盘,然后显示 numberPad,以便将正确的 TextField 推送到屏幕上。
我已经为 numberField TextField 尝试了各种修饰符,例如:
.onAppear {
isFocused = nil
isFocused = .numberField
}
.onAppear {
isFocused = nil
sleep(1)
isFocused = .numberField
}
.focused($isFocused, equals: nil)
.keyboardType(.numberPad)
.focused($isFocused, equals: .numberField)
None 工作。键盘切换,但屏幕没有滚动到正确的字段。
由于这是一个多字段表单,我使用提交按钮在字段之间切换,如下所示:
TextField("", text: $field1)
.focused($isFocused, equals: .field1)
.keyboardType(.default)
.onSubmit {
if isFocused == .field1 {
isFocused = .numberField
}
}
.submitLabel(.next)
TextField("", text: $numberField)
.focused($isFocused, equals: .numberField)
.keyboardType(.numberPad)
如果我手动关闭 field1 的默认键盘,然后点击 numberField TextField,则 numberPad 出现并且该字段正确聚焦。因此,我需要以某种方式自动关闭默认键盘,然后显示 numberPad,以便为用户在屏幕上显示正确的字段。
为了关闭现有键盘然后显示新类型的键盘,同时保持键盘避免并专注于正确的 TextField,您需要按如下方式使用 DispatchQueue:
TextField("", text: $field1)
.focused($isFocused, equals: .field1)
.keyboardType(.default)
.onSubmit {
if isFocused == .field1 {
isFocused = nil
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
isFocused = .numberField
}
}
}
通过使用 DispatchQueue,您允许应用保持 运行,同时完全关闭键盘,等待 x 秒(在我的示例中是 0.3 秒,感觉非常瞬间),然后调出新键盘。