简而言之,我试图在添加条目时实现 Reminders.app 交互,点击 [Return],然后可以立即添加下一个条目(即键盘不会关闭,但只有在按下 [Return] 时才会关闭)空行)。
如果不是这个问题,这将很简单:如何使用 SwiftUI 使用 @FocusState 保持键盘打开而不弹起?(键盘在 [Return] 后弹起)。
我考虑了很多解决方案,但保持键盘正常的最干净的方法是利用内省:
class TextFieldKeyboardBehavior: UIView, UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
return false
}
}
struct TestView: View {
@State var text: String = ""
var textFieldKeyboardBehavior = TextFieldKeyboardBehavior()
var body: some View {
VStack {
TextField("Title", text: $text)
.introspect(.textField, on: .iOS(.v17)) {
$0.delegate = textFieldKeyboardBehavior
}
.onSubmit {
// code
}
}
}
}
现在这种方法的(大!)问题是
onSubmit
永远不会被调用。如果我添加 onChange
修饰符,则每次按下时都会调用它,但我不相信观察此处的值变化可以可靠地检测何时是实际关闭键盘的正确时刻。我知道我有效地禁用了 [Return] 功能,因此这种行为应该不足为奇,但后来我想知道是否有另一种方法利用内省与 TextField
相结合来实现我所追求的功能:1)键盘不会在 [Return] 上关闭,并且 2) 始终检测到 [Return]。
这是我使用@FocusState 得出的结论。在文本字段中输入文本并按回车键。 .onSubmit() 将添加另一个 TextField 并在不关闭键盘的情况下转移其焦点。
import SwiftUI
struct TextView: View {
@State private var textFields: [String] = [""]
@FocusState private var focusField: Int?
var body: some View {
VStack {
ForEach(0..<textFields.count, id: \.self) { index in
TextField("Enter text", text: $textFields[index])
.padding()
.onSubmit {
textFields.append("")
focusField = textFields.count - 1
}
.focused($focusField, equals: index)
}
}
}
}