循环选择数组中的选择器选择

Dan*_*Dan 5 swiftui

我对 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)

'''

Joa*_*son 7

这里的问题是您正在以编程方式更新 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

  • 这太棒了,非常感谢您解释我哪里出错了:)谢谢! (2认同)