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 秒,感觉非常瞬间),然后调出新键盘。