遵循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
——但它被放置在非视图位的代码中。
从逻辑上看,我认为前提是:
- 如果用户的订阅是活跃的,点击一个链接应该将他们发送到冥想视图。
- 如果他们的订阅不活跃,那么点击将设置一个状态变量,将显示付费墙视图(例如,
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
被指定了两次,但是现在你的代码在做什么更清楚了。