Swiftui .sheet:仅显示一次,然后再也不会显示

Swiftui .sheet:仅显示一次,然后再也不会显示,swiftui,Swiftui,使用Beta4时,该缺陷似乎仍然存在。以下视图序列(列表,点击列表条目打开另一个列表)允许仅显示一次列表视图;从不调用onDisappear,因此showmodel标志会更改,但在再次点击时不会触发重新显示ListView。因此,对于每个GridCellBodyEntry,.sheet演示文稿只工作一次,然后再也不会工作 我尝试了一些建议和解决方法,但都没有成功(例如,使用NavigationViewModel进行封装)。我甚至试图删除这个列表,因为有一个假设是List导致了这种行为,但即使这样

使用Beta4时,该缺陷似乎仍然存在。以下视图序列(列表,点击列表条目打开另一个列表)允许仅显示一次
列表视图
;从不调用
onDisappear
,因此
showmodel
标志会更改,但在再次点击时不会触发重新显示
ListView
。因此,对于每个
GridCellBodyEntry
.sheet
演示文稿只工作一次,然后再也不会工作

我尝试了一些建议和解决方法,但都没有成功(例如,使用NavigationViewModel进行封装)。我甚至试图删除这个列表,因为有一个假设是
List
导致了这种行为,但即使这样也没有改变任何事情

有什么想法吗

设置:

  • 具有此视图的
    GridCellBody
  • 具有此定义的
    GridCellBodyEntry
  • 具有此定义的
    列表视图
  • BaseViewModel
    (节选):
  • class BaseViewModel:BindableObject{
    ///绑定支持。
    var willChange=PassthroughSubject()
    ///上下文。
    变量上下文:NSManagedObjectContext
    ///当前已键入项的列表。
    变量列表:[NSManagedObject]=[]
    //…其他东西。。。
    }
    
    其中,
    willChange.send()
    在某些内容发生更改(创建、修改、删除操作)时被调用。

    这是

    以下简化代码展示了您正在经历的行为(该工作表仅显示一次):


    我从来没有遇到过这个问题。不是说它没有发生,而是。。。。一个想法。你能试试下面的吗?(1) 一个非常简单的项目——事实上,我今天发布了一个完整的答案,其中一个回购协议有效——不管怎么说,一个简单的项目就是反复地显示一张表并将其驳回。(2) 添加一个简单的
    列表
    ,它没有什么作用,只显示主/详细信息和状态更新。然后,也只有在那时,再加上做一个模态表。再次重申,我并不是说这不是一个bug(如果事实上这是一个bug,你有没有向苹果提交过它?)我只是想排除一些自beta 1以来我从未见过的东西。这里有一个链接到我的答案,其中有一个链接到beta 4项目,它使用了一个模型,一个带有关闭按钮的表单,并且是为beta 4编写的:我拿了你的回购项目,它成功了。然后我把
    VStack
    改为
    List
    ,它坏了。然后我在
    填充()之后移动了
    .sheet
    (即,在
    列表
    括号外,它再次工作。将所有内容放在
    导航视图
    中,仍然工作。将
    列表
    中的内容包装到
    ForEach
    中,仍然工作。这真的很奇怪,因为这与我当前的代码类似,但不工作。有一个主要区别:虽然如果您通过
    环境对象提交视图模型,我会将其作为参数提交。将对其进行更改,并查看其是否有影响。(实际上,据我所知,这不会产生影响…但您永远不知道…)好的,我尝试了更多:在master中,我拿出了
    GeometryReader
    VStack
    部分
    -没有变化。在细节中,我拿出了
    NavigationView
    VStack
    -没有变化。之前,我改成了
    EnvironmentObject
    ,用于移交视图模型-没有变化。非常奇怪……我返工了我用你的代码替换了我的代码,它仍然只显示一次。这也发生在滚动视图中
    var body: some View {
    
            GeometryReader { geometry in
    
                VStack {
    
                    List {
    
                        Section(footer: self.footerView) {
    
                            ForEach(self.rawEntries) { rawEntry in
    
                                GridCellBodyEntry(entityType: rawEntry)
                            }
                        }
                    }
                    .background(Color.white)
                }
            }
        }
    
    struct GridCellBodyEntry: View {
    
    
        let entityType: EntityType
        let viewModel: BaseViewModel
    
    
        init(entityType: EntityType) {
    
            self.entityType = entityType
            self.viewModel = BaseViewModel(entityType: self.entityType)
        }
    
    
        @State var showModal = false {
    
            didSet {
    
                print("showModal: \(showModal)")
            }
        }
    
    
        var body: some View {
    
            Group {
    
                Button(action: {
    
                    self.showModal.toggle()
                },
                       label: {
    
                        Text(entityType.localizedPlural ?? "")
                            .foregroundColor(Color.black)
                })
                .sheet(isPresented: $showModal, content: {
    
                    ListView(showModal: self.$showModal,
                             viewModel: self.viewModel)
                })
            }.onAppear{
                print("Profile appeared")
            }.onDisappear{
                print("Profile disappeared")
            }
        }
    }
    
    struct ListView: View {
    
    
        // MARK: - Private properties
    
    
        // MARK: - Public interface
    
    
        @Binding var showModal: Bool
        @ObjectBinding var viewModel: BaseViewModel
    
    
        // MARK: - Main view
    
    
        var body: some View {
    
            NavigationView {
    
                VStack {
    
                    List {
    
                        Section(footer: Text("\(viewModel.list.count) entries")) {
    
                            ForEach(viewModel.list, id: \.objectID) { item in
    
                                NavigationLink(destination: ItemView(),
                                               label: {
    
                                                Text("\(item.objectID)")
                                })
                            }
                        }
                    }
                }
                .navigationBarItems(leading:
    
                    Button(action: {
    
                        self.showModal = false
                    }, label: {
    
                        Text("Close")
                    }))
    
                .navigationBarTitle(Text(viewModel.entityType.localizedPlural ?? ""))
            }
        }
    }
    
    class BaseViewModel: BindableObject {
    
        /// The binding support. 
        var willChange = PassthroughSubject<Void, Never>()
    
        /// The context.
        var context: NSManagedObjectContext
    
        /// The current list of typed items.
        var list: [NSManagedObject] = []
    
        // ... other stuff ...
    }
    
    import SwiftUI
    
    struct ContentView: View {
        @State var isPresented = false
        @State var whichPresented = -1
    
        var body: some View {
            NavigationView {
                List {
                    ForEach(0 ..< 10) { i in
                        Button(action: {
                                self.whichPresented = i
                                self.isPresented.toggle()
                            })
                            { Text("Button \(i)") }
                        }.sheet(isPresented: $isPresented, content: { 
    Text("Destination View \(self.whichPresented)") })
                    }
                }
        }
    }
    
    import SwiftUI
    
    struct ContentView: View {
        @State var isPresented = false
        @State var whichPresented = -1
    
        var body: some View {
            NavigationView {
                List {
                    ForEach(0 ..< 10) { i in
                        Button(action: {
                                self.whichPresented = i
                                self.isPresented.toggle()
                            })
                            { Text("Button \(i)") }
                        }
                    }
                }.sheet(isPresented: $isPresented, content: { Text("Destination View \(self.whichPresented)") })
        }
    }