SwiftUI fullScreenCover 无详细信息

SwiftUI fullScreenCover no Detail

我需要帮助。我希望详细视图显示在 fullScreenCover 上,下面的代码不起作用。 通过 RowView 从“dataList”创建一个模板。 使用 NavigationLink 它可以工作。 使用 fullScreenCover 这在这里不起作用,数据仅静态显示而不是动态显示。 在此先感谢您的任何建议。 我创建了一个简单的示例项目来重现该问题。这是代码:



import SwiftUI

struct Data: Identifiable  {
    
    var id = UUID()
    var title: String
    var titleSecondScreen: String
}


let dataList = [
    Data(title: "Test1", titleSecondScreen: "Second1"),
    Data(title: "Test2", titleSecondScreen: "Second2"),
    Data(title: "Test3", titleSecondScreen: "Second3"),
    Data(title: "Test4", titleSecondScreen: "Second4"),
    Data(title: "Test5", titleSecondScreen: "Second5"),
]



struct ContentView: View {

    let list: Data
    
    @State private  var fullScreen = false
    @State  var selectedData: Data
    
    
    var body: some View {
        
        ForEach(dataList) { value in
            
            Button {
                fullScreen.toggle()
                selectedData = value
            } label: {
                
                Text(value.title)
                    .padding()
                
            }
        }
        .fullScreenCover(isPresented: $fullScreen) {
            fullScreenView(list: dataList[0])
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(list: dataList[0], selectedData: dataList[0])
    }
}


struct fullScreenView: View {
    
    let list: Data
    
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        
        
        VStack {
            Text(list.titleSecondScreen)
                .padding()
            
            Button {
                presentationMode.wrappedValue.dismiss()
            } label: {
               Text("Closed FullScreen")
            }
        }
    }
}

struct fullScreenView_Previews: PreviewProvider {
    static var previews: some View {
        fullScreenView(list: dataList[0])
    }
}

这里是 Github Link: enter link description here

您可以使用 fullScreen(item:) 版本将所选项目发送到 FullScreenView

struct MyData: Identifiable  {
    var id = UUID()
    var title: String
    var titleSecondScreen: String
}

let dataList = [
    MyData(title: "Test1", titleSecondScreen: "Second1"),
    MyData(title: "Test2", titleSecondScreen: "Second2"),
    MyData(title: "Test3", titleSecondScreen: "Second3"),
    MyData(title: "Test4", titleSecondScreen: "Second4"),
    MyData(title: "Test5", titleSecondScreen: "Second5"),
]

struct ContentView: View {
    @State private var selectedData: MyData?
    
    var body: some View {
        ForEach(dataList) { value in
            
            Button {
                selectedData = value
            } label: {
                Text(value.title)
                    .padding()
            }
        }
        .fullScreenCover(item: $selectedData) { item in
            FullScreenView(item: item)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


struct FullScreenView: View {
    
    let item: MyData
    
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        VStack {
            Text(item.titleSecondScreen)
                .padding()
            Button {
                presentationMode.wrappedValue.dismiss()
            } label: {
               Text("Close FullScreen")
            }
        }
    }
}

我还做了一些其他的小改动:

  1. 使用标准 Swift 类型名称的大写
  2. 避免使用 Data 类型,因为它与正常的 Swift Data 类型冲突
  3. 删除 ContentView 中未使用的 list 参数