Ios .fullScreenCover始终打开相同的详细信息页

Ios .fullScreenCover始终打开相同的详细信息页,ios,swift,swiftui,Ios,Swift,Swiftui,所以我这里有一个问题,我希望很容易解决,只是现在还不能解决。我正在运行一个循环,通过一些CoreData信息(帖子)并返回一个图像网格,我希望能够单击这些图像并打开包含正确信息的DetailView的完整屏幕。对于当前代码,DetailView始终显示第一篇文章中的数据。如果我将它从一个按钮更改为NavigationLinkNavigationLink(destination:DetailView(post:post)),正如代码中所注释的那样,它工作得很好,但没有提供我想要的完整屏幕覆盖行为。

所以我这里有一个问题,我希望很容易解决,只是现在还不能解决。我正在运行一个循环,通过一些CoreData信息(帖子)并返回一个图像网格,我希望能够单击这些图像并打开包含正确信息的DetailView的完整屏幕。对于当前代码,DetailView始终显示第一篇文章中的数据。如果我将它从一个按钮更改为NavigationLink
NavigationLink(destination:DetailView(post:post))
,正如代码中所注释的那样,它工作得很好,但没有提供我想要的完整屏幕覆盖行为。我做错了什么?提前谢谢

@FetchRequest(entity: Post.entity(), sortDescriptors: []) var posts: FetchedResults<Post>

enum ActiveSheet: Identifiable {
        case detail, addNew
        
        var id: Int {
            hashValue
        }
    }
@State var activeSheet: ActiveSheet?

var body: some View {

ForEach(posts.reversed(), id: \.self) { post in
    
    VStack {
    Button(action: { activeSheet = .detail }){
    //NavigationLink(destination: DetailView(post: post)){
    ZStack {
    Image(uiImage: UIImage(data: post.mainImage ?? self.image)!)
        VStack {
        Text("\(post.title)")
        Text("\(post.desc)")
        }
    }
}
.fullScreenCover(item: $activeSheet) { item in
            switch item {
            case .detail:
                DetailView(post: post)
            case .addNew:
                AddNewView()
            }
        }
}
}
}
@FetchRequest(实体:Post.entity(),sortDescriptors:[])var posts:FetchedResults
枚举活动表:可识别{
案例详情,新增
变量id:Int{
哈希值
}
}
@状态变量activeSheet:activeSheet?
var body:一些观点{
ForEach(posts.reversed(),id:\.self){post-in
VStack{
按钮(操作:{activeSheet=.detail}){
//导航链接(目的地:详细视图(post:post)){
ZStack{
图像(uiImage:uiImage(数据:post.mainImage??self.Image)!)
VStack{
文本(“\(post.title)”)
文本(“\(post.desc)”)
}
}
}
.fullScreenCover(项目:$activeSheet){中的项目
开关项{
案例.详情:
详细视图(post:post)
案例.新增:
AddNewView()
}
}
}
}
}

我现在已经将POST数组设置为静态,而不是来自核心数据,并模拟了对象/结构,以便可以轻松测试,但主体应该保持不变:

struct ContentView : View {
    //@FetchRequest(entity: Post.entity(), sortDescriptors: []) var posts: FetchedResults<Post>
    var posts : [Post] = [Post(title: "1", desc: "desc1"),
                          Post(title: "2", desc: "desc2"),
                          Post(title: "3", desc: "desc3")]
    
    enum ActiveSheet: Identifiable {
        case detail(post: Post)
        case addNew
        
        var id: UUID {
            switch self {
            case .detail(let post):
                return post.id
            default:
                return UUID()
            }
        }
    }
    @State var activeSheet: ActiveSheet?
    
    var body: some View {
        
        ForEach(posts.reversed(), id: \.self) { post in
            
            VStack {
                Button(action: { activeSheet = .detail(post: post) }){
                    ZStack {
                        //Image(uiImage: UIImage(data: post.mainImage ?? self.image)!)
                        VStack {
                            Text("\(post.title)")
                            Text("\(post.desc)")
                        }
                    }
                }
            }
            .fullScreenCover(item: $activeSheet) { item in
                switch item {
                case .detail(let post):
                    DetailView(post: post)
                case .addNew:
                    AddNewView()
                }
            }
        }
    }
}

struct DetailView : View {
    var post: Post
    
    var body : some View {
        Text("Detail \(post.id)")
    }
}

struct AddNewView : View {
    var body : some View {
        Text("add")
    }
}

struct Post : Hashable {
    var id = UUID()
    var title : String
    var desc : String
}
struct ContentView:View{
//@FetchRequest(实体:Post.entity(),sortDescriptors:[])var posts:FetchedResults
var posts:[Post]=[Post(标题:“1”,描述:“描述1”),
职位(标题:“2”,描述:“描述2”),
职位(标题:“3”,描述:“描述3”)]
枚举活动表:可识别{
个案详情(职位:职位)
案例新增
变量id:UUID{
切换自身{
案例详细信息(请张贴):
返回邮政编码
违约:
返回UUID()
}
}
}
@状态变量activeSheet:activeSheet?
var body:一些观点{
ForEach(posts.reversed(),id:\.self){post-in
VStack{
按钮(操作:{activeSheet=.detail(post:post)}){
ZStack{
//图像(uiImage:uiImage(数据:post.mainImage??self.Image)!)
VStack{
文本(“\(post.title)”)
文本(“\(post.desc)”)
}
}
}
}
.fullScreenCover(项目:$activeSheet){中的项目
开关项{
案例详细信息(请张贴):
详细视图(post:post)
案例.新增:
AddNewView()
}
}
}
}
}
结构详细视图:视图{
var post:post
var body:一些观点{
文本(“详细信息\(post.id)”)
}
}
结构AddNewView:View{
var body:一些观点{
文本(“添加”)
}
}
结构Post:Hashable{
var id=UUID()
变量标题:字符串
变量描述:字符串
}
基本思想是,不要在第一次渲染时创建
全屏封面
,而应该基于
activeSheet
创建它,以便动态创建它。您已经使用
项:
activeSheet
了,问题是它没有绑定到实际的帖子,因为您我们只是使用按钮设置
activeSheet=.detail

我在
案例详细信息
中添加了一个关联属性,允许您将帖子绑定到它。然后,在
全屏封面
中,您可以看到我在创建
详细视图
时使用了该关联值


您可能需要稍微调整以适应您的
Post
模型,但概念将保持不变。

最佳做法是避免.sheet和.fullScreenCover闭包中的任何条件逻辑。解决方案如下: