xcode 使用与for循环索引相关的按钮一开始顺序不对(SwiftUI)

0s7z1bwu  于 2023-05-19  发布在  Swift
关注(0)|答案(1)|浏览(167)

我有一个for循环,它遍历一个名为'countries'的数组,该数组包含大约5-10个类型为'Country'的结构体。数组的每个循环在HStack中创建一个按钮,按钮动作设置一个变量,该变量等于被点击的国家(传递到下一个视图)

**让我给予一个问题的例子:**假设for循环加载,我点击哥斯达黎加。假设countrySelected变量应设置为哥斯达黎加,fullScreenCover应为true。加载下一个视图,并显示不正确的国家。如果我回去选择同一个国家,它也会做同样的事情。只有在我选择了一个不同的国家后,它才开始工作。

不确定是什么导致了这个问题。我知道我可以使用导航链接来使它工作,但在我的情况下,我不能使用它。任何帮助是赞赏!

下面是showingCountryPage,如果为true,将激活fullScreenCover和countrySelected,它将跟踪在for循环中单击哪个国家按钮

@State private var showingCountryPage = false
@State var countrySelected = Country(name: "Brazil", code: "BR", continent: "South America")

下面是国家数组的示例

@State var countries = [Country(name: "France", code: "FR", continent: "Europe"), Country(name: "United States", code: "US", continent: "North America")].shuffled()

下面是视图中for循环的代码

HStack(spacing: 12){

        Text(" ")

        ForEach(countries, id: \.self){country in

            Button(action: {
                
                self.countrySelected = country
                showingCountryPage = true
            }){

                ZStack(alignment: .center){

                    ZStack{
                        Image(country.code.lowercased() + "1")
                            .resizable()
                            .scaledToFill()
                            .frame(width: 200, height: 150)
                            .clipped()
                        
                        Color.white
                            .opacity(0)
                            .frame(width: 200, height: 150)
                            .background(
                                LinearGradient(gradient: Gradient(colors: [.clear, .black, .clear]), startPoint: .top, endPoint: .bottom).opacity(0.4))
                        
                    }
                        

                    Text(country.name)
                        .font(.custom(
                                "Poppins-SemiBold",
                                fixedSize: 18))
                        .foregroundColor(.white)
                        .padding()
                        .multilineTextAlignment(.center)
                        .shadow(color: .black.opacity(0.25), radius: 1, x: 0, y: 0)
                    

                }.frame(width: 200, height: 150).cornerRadius(10).padding(.vertical)

            }.fullScreenCover(isPresented: $showingCountryPage, content: {NavigationView{ViewCountryHome(country: countrySelected)}})

        }

    }

}.padding(.top, 5)
8ljdwjyq

8ljdwjyq1#

使用.fullScreenCover(item:...)尝试这种方法,例如:

@State var countrySelected: Country?
// ....

.fullScreenCover(item: $countrySelected) { country in 
   NavigationView {
      ViewCountryHome(country: country)
   } 
}

不需要showingCountryPage

相关问题