对于每个循环从一个数组与Navigationlink按钮参数传递给调用,不接受参数



遵循RevenueCat的在线教程从数组中调用信息。这将显示可滚动的图片作为可点击的按钮。我遇到的问题是创建一个导航链接到不同的图片相对于从数组/模型信息的信息。如有任何提示,不胜感激

struct Meditation: Identifiable {

var id = UUID()
var title:String = ""
var desc:String = ""
var imageName = ""
var productId:String?


static func getSampleMeditations() -> [Meditation] {

var array = [Meditation]()

var m1 = Meditation()
m1.title = "GP Calculator"
m1.desc = "Simple GP Calculator"
m1.imageName = "ambition"
m1.productId = "ambition"
array.append(m1)
-----------
struct ContentView: View {
         @EnvironmentObject var userViewModel: UserViewModel
         @State var isPaywallPresented = false
var body: some View {      
            TabView {            
              NavigationView {
                ScrollView (showsIndicators: false) {
                    VStack (alignment: .leading) {
ForEach(Meditation.getSampleMeditations()) { meditation in

Button {

if userViewModel.isSubscriptionActive {

NavigationLink(destination: Meditation(array: meditation) )
}
else {
isPaywallPresented = true }
} label: {
Card(meditation: meditation)
.padding(.bottom, 20)
}
}


// TODO: Show  meditation
//         NavigationLink(destination: GP_Calculator() )
//   Meditation.getSampleMeditations()
//         NavigationLink(destination: Meditation(array: meditation) )
//     Meditation(meditation: title)
//    ContentView()

根本问题出在这部分代码上:

Button {
if userViewModel.isSubscriptionActive {
NavigationLink(destination: Meditation(array: meditation) )
} else {
isPaywallPresented = true 
}
} label: {
Card(meditation: meditation)
.padding(.bottom, 20)
}

Button在这里取两个不同的块。第一个是动作,它应该是Swift代码,用于在点击按钮时更新应用程序的状态。第二个是标签(也就是按钮的可见内容),它显示了您的卡片视图。

问题是NavigationLink是一个视图——实际上是一种特殊的Button——但它被放置在非视图位的代码中。

从逻辑上看,我认为前提是:

  1. 如果用户的订阅是活跃的,点击一个链接应该将他们发送到冥想视图。
  2. 如果他们的订阅不活跃,那么点击将设置一个状态变量,将显示付费墙视图(例如,fullScreenCover或类似)。

最简单的方法是将if语句移到外部,并创建Card的两个替代表示。

if userViewModel.isSubscriptionActive {
NavigationLink(destination: Meditation(array: meditation)) {
Card(meditation: meditation)
.padding(.bottom, 20)
}
} else {
Button {
isPaywallPresented = true
} label: {
Card(meditation: meditation)
.padding(.bottom, 20)
}
}

当然,Card被指定了两次,但是现在你的代码在做什么更清楚了。

最新更新