修复拼写页闪退:改用 becomeFirstResponder 管理焦点
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ import UIKit
|
|||||||
struct KeystrokeCaptureField: UIViewRepresentable {
|
struct KeystrokeCaptureField: UIViewRepresentable {
|
||||||
let onChar: (Character) -> Void
|
let onChar: (Character) -> Void
|
||||||
let onBackspace: () -> Void
|
let onBackspace: () -> Void
|
||||||
|
@Binding var isActive: Bool
|
||||||
|
|
||||||
func makeUIView(context: Context) -> UITextField {
|
func makeUIView(context: Context) -> UITextField {
|
||||||
let tf = UITextField()
|
let tf = UITextField()
|
||||||
@@ -19,7 +20,13 @@ struct KeystrokeCaptureField: UIViewRepresentable {
|
|||||||
Coordinator(onChar: onChar, onBackspace: onBackspace)
|
Coordinator(onChar: onChar, onBackspace: onBackspace)
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateUIView(_ uiView: UITextField, context: Context) {}
|
func updateUIView(_ uiView: UITextField, context: Context) {
|
||||||
|
if isActive {
|
||||||
|
uiView.becomeFirstResponder()
|
||||||
|
} else {
|
||||||
|
uiView.resignFirstResponder()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class Coordinator: NSObject, UITextFieldDelegate {
|
class Coordinator: NSObject, UITextFieldDelegate {
|
||||||
let onChar: (Character) -> Void
|
let onChar: (Character) -> Void
|
||||||
@@ -61,7 +68,7 @@ struct SpellingWordInput: View {
|
|||||||
let blankPositions: [Int]
|
let blankPositions: [Int]
|
||||||
@Binding var currentBlankIndex: Int
|
@Binding var currentBlankIndex: Int
|
||||||
@Binding var filledBlanks: [String]
|
@Binding var filledBlanks: [String]
|
||||||
@FocusState private var isFocused
|
@State private var isFocused = false
|
||||||
|
|
||||||
private let chars: [String]
|
private let chars: [String]
|
||||||
|
|
||||||
@@ -85,11 +92,10 @@ struct SpellingWordInput: View {
|
|||||||
guard currentBlankIndex > 0 else { return }
|
guard currentBlankIndex > 0 else { return }
|
||||||
currentBlankIndex -= 1
|
currentBlankIndex -= 1
|
||||||
filledBlanks[currentBlankIndex] = ""
|
filledBlanks[currentBlankIndex] = ""
|
||||||
}
|
},
|
||||||
|
isActive: $isFocused
|
||||||
)
|
)
|
||||||
.frame(width: 0, height: 0)
|
.frame(width: 0, height: 0)
|
||||||
.opacity(0.01)
|
|
||||||
.focused($isFocused)
|
|
||||||
|
|
||||||
HStack(spacing: 4) {
|
HStack(spacing: 4) {
|
||||||
ForEach(Array(chars.enumerated()), id: \.offset) { index, ch in
|
ForEach(Array(chars.enumerated()), id: \.offset) { index, ch in
|
||||||
|
|||||||
Reference in New Issue
Block a user