在SwiftUI中的视图之间传递数据?

在SwiftUI中的视图之间传递数据?,swiftui,Swiftui,在我的swiftui应用程序中,我试图将一些简单的数据(字符串、URL和图像)从一个视图传递到另一个视图 这项简单的任务目前证明是一件令人头痛的事 这就是我到目前为止所做的: 在我的firstView中,我有: struct Book { var title: String var author: String } struct firstView: View { @State private var showAudioPlayer = false @Bin

在我的swiftui应用程序中,我试图将一些简单的数据(字符串、URL和图像)从一个视图传递到另一个视图

这项简单的任务目前证明是一件令人头痛的事

这就是我到目前为止所做的:

在我的
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)
    }

}