我对 Swift 和一般编码都很陌生,所以如果这是一个超级简单的问题,我深表歉意。
我试图在选择器的任一侧添加一个按钮,以允许用户在选择器内向上/向下移动选择(我的选择器是从数组填充的) - 我在应用程序的另一部分使用此选择。
下面的代码有效,但仅更新示例文本,但不会更新选择器中的选择以正确更新。
有什么想法我做错了吗?
import SwiftUI
struct ContentView: View {
let myArray = ["Period 1", "Period 2", "Period 3", "Period 4", "Period 5", "Period 6", "Period 7", "Period 8", "Period 9", "Period 10", "Period 11", "Period 12", "Period 13"]
@State var currentIndex = 0
var body: some View {
VStack(spacing: 20) {
HStack {
Button(action: {
if currentIndex == 0 {
} else {
currentIndex -= 1
}
}) {
Image(systemName: "chevron.left.circle")
.imageScale(.large)
}
.padding(2)
.frame(maxWidth: .infinity, alignment: .leading)
Picker(selection: $currentIndex, label: Text("Picker")) {
ForEach(myArray, id: \.self) {
Text($0)
}
}
Button(action: {
if currentIndex == 12 {
} else {
currentIndex += 1
}
}) {
Image(systemName: "chevron.right.circle")
.imageScale(.large)
}
.padding(2)
.frame(maxWidth: .infinity, alignment: .trailing)
}
.padding()
Text("\(myArray[currentIndex])")
}
}
}
Run Code Online (Sandbox Code Playgroud)
'''
这里的问题是您正在以编程方式更新 State 变量currentIndex,但没有修改数组选择。为了使这项工作有效,您需要在索引上迭代数组而不是元素,因此将代码更改Picker为此
Picker(selection: $currentIndex, label: Text("Picker")) {
ForEach(myArray.indices) { index in
Text(myArray[index])
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,选择器中的每个项目都会自动获取与该项目相匹配id的原始值,从而使该项目起作用。indexcurrentIndex
要直接使用数组的元素,这里有一个替代解决方案,其中添加一个新的 State 变量来保存选定的字符串。
@State var currentSelection = ""
@State var currentIndex = 0 {
didSet {
currentSelection = myArray[currentIndex]
}
}
Run Code Online (Sandbox Code Playgroud)
选择器代码更改为
Picker(selection: $currentSelection, label: Text("Picker")) {
ForEach(myArray, id: \.self) { period in
Text(period)
}
}
Run Code Online (Sandbox Code Playgroud)
但其余的代码是相同的,因为按钮仍在使用currentIndex
| 归档时间: |
|
| 查看次数: |
2329 次 |
| 最近记录: |