SwiftUI:如何在常规模式下在DetailView而非MasterView上显示模式表

时间:2019-08-31 09:32:30

标签: modal-dialog swiftui

我有一个Master-> Detail应用。 DetailView显示一个模式表。在纵向的iPhone XR上这可以正常工作。但是在横向视图中,模式表不会出现在DetailView的顶部,而是出现在MasterView的顶部。

如何预防?

我正在模式表中使用NavigationView。如果删除它,问题似乎就消失了。除了我不再需要标题和关闭按钮之外。

这是主视图的定义:

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: DetailView()) {
                    Text ("Master 1")
                }
                NavigationLink(destination: DetailView()) {
                    Text ("Master 2")
                }
            }
            .navigationBarTitle(Text("Master"))
        }
    }
}

按一行将显示模式表:

struct DetailView: View {
    @State var isPresented = false

    var body: some View {
        List {
            Button("Detail 1") {
                self.isPresented = true
            }
            Button("Detail 2") {
                self.isPresented = true
            }
        }
        .navigationBarTitle(Text("Detail"))
        .sheet(isPresented: $isPresented, content: {
            SheetView()
        })
    }
}

模式表依赖于NavigationView具有标题和关闭按钮。但是结果是,模态将以常规(横向)显示在主视图的顶部。

struct SheetView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var body: some View {
        NavigationView { // Mandatory for Title and Button
            Form {
                Text("Modal 1")
                Text("Modal 2")
            }
            .navigationBarTitle(Text("Some Modal"))
            .navigationBarItems(
                trailing: Button(action: {
                    self.presentationMode.wrappedValue.dismiss()
                }) {
                    Text("Close")
            })
        }
    }
}

2 个答案:

答案 0 :(得分:2)

问题是您的SheetView中的NavigationView,也使用了景观尺寸类,这意味着Sheet视图是隐藏的。在SheetView中,强制将其压缩,这将解决您的问题:

struct SheetView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var body: some View {
            NavigationView { // Mandatory for Title and Button
                Form {
                    Text("Modal 1")
                    Text("Modal 2")
                }
                .navigationBarTitle(Text("Some Modal"))
                .navigationBarItems(
                    trailing: Button(action: {
                        self.presentationMode.wrappedValue.dismiss()
                    }) {
                        Text("Close")
                })
            }.environment(\.horizontalSizeClass, .compact)        
    }
}

答案 1 :(得分:0)

NavigationView {
    ...
}
.navigationViewStyle(StackNavigationViewStyle())

PS:.environment(\.horizontalSizeClass, .compact) 可能对我有帮助,但在我的情况下失败了。