SwiftUI 线程 1:致命错误:索引超出范围

SwiftUI Thread 1: Fatal error: Index out of range

提问人:Tomas Gavenavičius 提问时间:10/12/2023 最后编辑:HangarRashTomas Gavenavičius 更新时间:10/13/2023 访问量:41

问:

在一个 ColorOptions 视图中,我有 7 种具有不同不透明度的颜色,并且选择器可以在另一个视图中更改 Circle() 的这些颜色,但有问题,“.fill”,因为当我尝试用与索引相同的颜色填充颜色时,当应用程序启动时出现索引超出范围的错误,另一行代码(GPT 提供)具有默认颜色, 但问题是当应用程序启动时,以相同的 colorIndex 但默认颜色启动,当需要启动相同的颜色时,哪个应用程序关闭,所以问题,如何启动与应用程序关闭时相同的填充 Circle() 颜色的应用程序?在打印语句中,当应用程序启动时,可以看到 selectedColorIndex 相同,但颜色变为“0”、“.red.opacity(0.3)”,并且行“.fill(selectedColors[selectedColorIndex])”出现错误,其中索引和 selectedC olor supose 相同。

ColorOptions 视图:

 @Binding var selectedColorIndex: Int
 @Binding var selectedColors: [Color]
 @State private var colorOptions: [(name: String, colors: [Color])] = [
        ("Red", [
            .red.opacity(0.1),
            .red.opacity(0.3),
            .red.opacity(0.2),
            .red.opacity(0.1),
            .red.opacity(0.3),
            .red.opacity(0.1),
            .red.opacity(0.3),
            .red.opacity(0.1),
            .red.opacity(0.1),
            .red.opacity(0.3),
            .red.opacity(0.1),
            .red.opacity(0.2),
            .red.opacity(0.1),
            .red.opacity(0.2),
            .red.opacity(0.3),
            
        ]),
        ("White", [
            .white.opacity(0.1),
            .white.opacity(0.3),
 VStack {
            Picker("Select a color", selection: $selectedColorIndex) {
                ForEach(0..<colorOptions.count, id: \.self) { index in
                    Text(colorOptions[index].name)
                        .foregroundColor(index == selectedColorIndex ? .primary : .secondary)
                        .tag(index)
                }
            }
            .pickerStyle(.wheel)
            .onChange(of: selectedColorIndex) { newValue in
                if newValue < colorOptions.count {
                    selectedColors = colorOptions[newValue].colors
                    print("Selected color index changed to: \(newValue)")
                    print("Number of selected color index: \(selectedColorIndex)")
                    userDefaultsManager.saveSelectedColorIndex(newValue)
                    userDefaultsManager.saveSelectedColors(selectedColors)
                    isSheetPresented = false
                }
            }
        }

另一种观点:

 @Binding var selectedColors: [Color]
 @Binding var selectedColorIndex: Int


    
 var body: some View {
 ZStack {
            ForEach(0..<15, id: \.self) { index in
                Circle()
                    .fill(selectedColors[selectedColorIndex])
//                        .fill(selectedColorIndex < selectedColors.count ? selectedColors[selectedColorIndex] : .red.opacity(0.3))
                        .frame(width: circleSizes[index], height: circleSizes[index])
                        .blur(radius: 45)
                        .position(randomPosition(index: index))
                        .animation(
                            Animation.linear(duration: 9)
                                .repeatForever(autoreverses: true)
                        )
                }
            }
        }

尝试使用“.fill(selectedColorIndex < selectedColors.count ?selectedColors[selectedColorIndex] : .red.opacity(0.3))“ GPT 提供了行,但这一行具有默认颜色,当打开应用程序 Circle() 时以相同的颜色开头,但在 print 语句中写入颜色索引不同,尝试不使用默认颜色,用户无需每次应用程序启动时更改。

用户界面 SwiftUI 索引 范围

评论

0赞 Sweeper 10/12/2023
什么是“另一种观点”?它与“ColorOptions View”有什么关系?请展示一个最小的可重复示例
0赞 Sweeper 10/12/2023
还有 和 的初始值是什么?selectedColorsselectedColorIndex
0赞 Tomas Gavenavičius 10/12/2023
@Sweeper稍微编辑过的“另一个视图”中,可以圈出可以更改的颜色,并希望在应用程序启动时使用相同的颜色,当应用程序关闭时,颜色是相同的颜色。“selectedColors”和“selectedColorIndex”是颜色选择器中的颜色,当应用程序启动时,可以从选择中更改这些颜色。
0赞 lorem ipsum 10/12/2023
您应该希望使用范围和索引来“揭开 SwiftUI 的神秘面纱”是不安全的

答: 暂无答案