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