首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在iPad/拆分视图布局中剔除SwiftUI中的详细视图?

如何在iPad/拆分视图布局中剔除SwiftUI中的详细视图?
EN

Stack Overflow用户
提问于 2021-12-24 23:07:16
回答 2查看 597关注 0票数 2

我试图在iPad上的主详细信息视图中排除详细信息(例如,如果在主视图中删除了该项,并且需要在右侧空白)。

代码语言:javascript
运行
复制
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上,它将细节视图保存在那里,而不是返回到空白视图。

以下是选择项目之前的视图。您可以看到右边的空白视图。

在选择项目后,选择左侧,右侧显示适当的详细视图。

在通过对所选内容(或使用环境解散)进行查询来取消视图后,左侧的选择将消失,但右侧的详细视图将保持不变。这应该已经消失了,空白的视图应该再次显示。

EN

回答 2

Stack Overflow用户

发布于 2021-12-25 09:36:18

如果您愿意放弃splitView (在侧边栏上有项),您可以覆盖默认导航设置,使其行为与iPhone (使用堆叠导航视图)相同,那么“退出”按钮就能正常工作。将此修饰符.navigationViewStyle(StackNavigationViewStyle())添加到NavigationView

代码语言:javascript
运行
复制
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())
    }
}

票数 1
EN

Stack Overflow用户

发布于 2021-12-25 20:01:04

我已经想出了一个可行的解决方案,但是它需要一些额外的逻辑。它需要进行某种检查,以查看数据是否存在,如果没有,则有条件地显示主视图或空白视图。

下面是我在问题中使用的示例的修改后的DetailView。如果选择绑定为零,则再次显示空白视图。

代码语言:javascript
运行
复制
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。我决定把这个做个扩展,让这更容易。

代码语言:javascript
运行
复制
extension View {
    
    @ViewBuilder
    public func blankWithoutContext<BlankView>(_ object: NSManagedObject, blankView: () -> BlankView) -> some View where BlankView: View {
        if object.managedObjectContext != nil {
            self
        } else {
            blankView()
        }
    }
}

它是这样使用的:

代码语言:javascript
运行
复制
MyView()
    .blankWithoutContext(object) {
        Text("Blank View")
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70477049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档