在SwiftUI中的视图之间传递数据?
在我的swiftui应用程序中,我试图将一些简单的数据(字符串、URL和图像)从一个视图传递到另一个视图 这项简单的任务目前证明是一件令人头痛的事 这就是我到目前为止所做的: 在我的在SwiftUI中的视图之间传递数据?,swiftui,Swiftui,在我的swiftui应用程序中,我试图将一些简单的数据(字符串、URL和图像)从一个视图传递到另一个视图 这项简单的任务目前证明是一件令人头痛的事 这就是我到目前为止所做的: 在我的firstView中,我有: struct Book { var title: String var author: String } struct firstView: View { @State private var showAudioPlayer = false @Bin
firstView
中,我有:
struct Book {
var title: String
var author: String
}
struct firstView: View {
@State private var showAudioPlayer = false
@Binding var tabSelection: Int
init(tabSelection: Binding<Int>) {
_tabSelection = tabSelection
}
var body: some View {
NavigationView {
ZStack {
Text("Tap Here")
.onTapGesture {
self.showAudioPlayer.toggle()
}
}
}
.fullScreenCover(isPresented: $showAudioPlayer, content: secondView.init)
}
}
但是,当我试图编译代码时,我遇到以下错误:
这个错误本身没有多大意义,我被卡住了
我做错了什么?
编译器将一个峰值带入结构,并看到两个非可选属性,认为它们应该在构造函数中。它不知道@Environment将被框架神奇地设置,所以它包含了该属性。正如@Baglan在上面所说的那样,你已经准备好了这本书,需要把它交进去
错误消息是“您要求我实例化audioPlayerView,我需要几个参数才能实现”,但您实际上只需要一个。看起来audioPaleyerView需要初始化一个Book参数,而现在编写代码的方式无法满足这一要求。@Baglan,我是否需要通过以下代码将Book参数传递给我的第二个视图:.fullScreenCover(显示:$showAudioPlayer,内容:secondView.init)?如果我正确理解了您的代码,那么您在代码中引用的“secondView”实际上是名为“audioPaleyerView”,我假设您一直在编辑代码示例,但错过了它。如果是这种情况,根据您的代码,它内部有一个“var book:book”变量,需要设置该变量以初始化视图结构。但是您正在传递“audioPaleyerView.init”作为初始化它的方法,它转换为没有任何参数的“audioPaleyerView()”,这就是编译器所抱怨的。根据提供的代码,我无法确定是否需要该参数,如果需要,从何处获取该参数。也许这样的代码可以工作:。全屏封面(显示:$showAudioPlayer,内容:{audioPaleyerView(书:书(标题:“title”,作者:“author”))}。当然,最终,你需要使用更有意义的书籍数据。@Baglan,是的,你是对的。在我的代码中,“secondView”是“audioPaleyerView”。很抱歉搞混了。
struct secondView: View {
@Environment(\.presentationMode) var presentationMode
var book: Book
var body: some View {
NavigationView {
ZStack{
VStack {
}
}
.background(Color.clear)
.navigationBarTitle("", displayMode: .inline)
.navigationBarItems(
leading: Button(action: {
presentationMode.wrappedValue.dismiss()
}) {
Image(systemName: "chevron.down.circle")
.foregroundColor(Color.black)
})
.frame(maxWidth: .infinity, maxHeight: .infinity)
.edgesIgnoringSafeArea(.all)
}
.edgesIgnoringSafeArea(.all)
}
}