我试图在iPad上的主详细信息视图中排除详细信息(例如,如果在主视图中删除了该项,并且需要在右侧空白)。
import SwiftUI
struct ContentView: View {
@State var selection: String?
var body: some View {
NavigationView {
List {
NavigationLink(tag: "item1", selection: $selection) {
DetailView(item: "Item 1", selection: $selection)
} label: {
Text("Item 1")
}
NavigationLink(tag: "item2", selection: $selection) {
DetailView(item: "Item 2", selection: $selection)
} label: {
Text("Item 2")
}
NavigationLink(tag: "item3", selection: $selection) {
DetailView(item: "Item 3", selection: $selection)
} label: {
Text("Item 3")
}
}
Text("Blank View")
}
}
}
struct DetailView: View {
let item: String
@Binding var selection: String?
@Environment(\.dismiss) var dismiss
var body: some View {
VStack {
Text("Detail for \(item)")
Button {
selection = nil
// dismiss()
} label: {
Text("Dismiss")
}
}
}
}
这是一个例子,说明了这个问题。当按下“解散”时,它将在iPhone上删除详细控制器的选择。在iPad上,它将细节视图保存在那里,而不是返回到空白视图。
以下是选择项目之前的视图。您可以看到右边的空白视图。
在选择项目后,选择左侧,右侧显示适当的详细视图。
在通过对所选内容(或使用环境解散)进行查询来取消视图后,左侧的选择将消失,但右侧的详细视图将保持不变。这应该已经消失了,空白的视图应该再次显示。
发布于 2021-12-25 09:36:18
如果您愿意放弃splitView
(在侧边栏上有项),您可以覆盖默认导航设置,使其行为与iPhone (使用堆叠导航视图)相同,那么“退出”按钮就能正常工作。将此修饰符.navigationViewStyle(StackNavigationViewStyle())
添加到NavigationView
struct ContentView: View {
@State var selection: String?
var body: some View {
NavigationView {
List {
NavigationLink(tag: "item1", selection: $selection) {
DetailView(item: "Item 1", selection: $selection)
} label: {
Text("Item 1")
}
NavigationLink(tag: "item2", selection: $selection) {
DetailView(item: "Item 2", selection: $selection)
} label: {
Text("Item 2")
}
NavigationLink(tag: "item3", selection: $selection) {
DetailView(item: "Item 3", selection: $selection)
} label: {
Text("Item 3")
}
}
Text("Blank View")
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
发布于 2021-12-25 20:01:04
我已经想出了一个可行的解决方案,但是它需要一些额外的逻辑。它需要进行某种检查,以查看数据是否存在,如果没有,则有条件地显示主视图或空白视图。
下面是我在问题中使用的示例的修改后的DetailView
。如果选择绑定为零,则再次显示空白视图。
struct DetailView: View {
let item: String
@Binding var selection: String?
var body: some View {
if selection != nil {
VStack {
Text("Detail for \(item)")
Button {
selection = nil
} label: {
Text("Dismiss")
}
}
} else {
Text("Blank View")
}
}
}
对于NSManagedObject
,您可以检查object.managedObjectContext != nil
。我决定把这个做个扩展,让这更容易。
extension View {
@ViewBuilder
public func blankWithoutContext<BlankView>(_ object: NSManagedObject, blankView: () -> BlankView) -> some View where BlankView: View {
if object.managedObjectContext != nil {
self
} else {
blankView()
}
}
}
它是这样使用的:
MyView()
.blankWithoutContext(object) {
Text("Blank View")
}
https://stackoverflow.com/questions/70477049
复制相似问题