我正在解决如何在纯SwiftUI中移动/跳转。下面是不正确工作的示例代码,但是有一个应该如何工作的概念。
struct ContentView: View {
@FocusState private var focused: Bool
@State private var activeIndex: Int = 0
var body: some View {
HStack(spacing: 3) {
ForEach(0..<10, id: \.self) { index in
Stone(activeIndex: $activeIndex, focused: _focused, index: index)
}
}
.padding(.horizontal)
}
}当我试图移动/跳转到下一个TextField时,问题是什么都不会发生。
struct Stone: View {
@Binding var activeIndex: Int
@FocusState var focused: Bool
@State var index: Int
@State private var text: String = ""
var body: some View {
GeometryReader { bounds in
ZStack {
TextField("", text: $text)
.multilineTextAlignment(.center)
.focused($focused)
.background(index == activeIndex ? .red : .green)
.onChange(of: text) { newValue in
if let lastValue = newValue.last {
text = String(lastValue)
activeIndex += 1
focused = true
}
}
}
.frame(width: bounds.size.width, height: bounds.size.height)
}
.scaledToFit()
}
}我发现了一些如何跳转/移动到下一个TextField的方法,但主要是在UIKit中。因此,我的问题是,如何在纯TextField中移动/跳转到下一个SwiftUI?
谢谢!
发布于 2022-07-27 16:52:37
这里有一个函数例子来理解我的问题是什么意思。
struct ContentView: View {
@FocusState private var focusedField: Int?
var body: some View {
HStack(spacing: 3) {
ForEach(0..<10, id: \.self) { index in
Stone(focusedField: _focusedField, index: index)
}
}
.padding(.horizontal)
}
}struct Stone: View {
@FocusState var focusedField: Int?
@State var index: Int
@State private var text: String = ""
var body: some View {
TextField("", text: $text)
.focused($focusedField, equals: index)
.textFieldStyle(.roundedBorder)
.onChange(of: text) { newValue in
setFocus(index: index)
}
}
func setFocus(index: Int) {
/// Default to the first box when focus is not set or the user reaches the last box
if focusedField == nil || focusedField == 9 {
focusedField = 0
} else {
/// Another safety check for the index
if index == 9 {
focusedField = 0
} else {
focusedField = index + 1
}
}
}
}感谢大家!
https://stackoverflow.com/questions/73108663
复制相似问题