在SwiftUI中,SplitView中导航主视图而不是详细视图

3

我在我的iPad应用程序中有一个分屏视图:

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink("Show the slave view HERE", destination: SlaveView())
                    .navigationBarTitle("Master view")
            }

            Text("Detail view")
                .navigationBarTitle("DO NOT show the slave view here")
        }
    }
}

所以我希望SlaveView视图在列表本身中打开,而不是在详细视图中。 我尝试在Slave中设置另一个NavigationView,还有下面的文本,还在每个MasterSlave上设置所有navigationViewStyle,但都没有成功。 这是你可以创建的最简单的Slave视图来构建它:
struct SlaveView: View {
    var body: some View {
        List {
            NavigationLink("Sub Detail view", destination: Text("Sub Detail view"))
        }
        .navigationBarTitle("Slave view")
    }
}

我该怎样改变分割视图的主(左)视图而不是详细(右)视图?
请注意,这是一个简化的可复制代码。实际项目使用更复杂的主从列表等等。另外,我们不想失去导航相关的东西,如过渡效果、标题转换、返回按钮等等。
为了更加清晰明了,我需要在流程中达到这个状态:

Needed step

3个回答

4

修改链接,使其不是详细信息

演示

NavigationLink("Show the slave view HERE", destination: SlaveView())
    .isDetailLink(false)

+1 右指针修饰符。但它有一个奇怪的错误!让我用 gif 向您展示:https://i.stack.imgur.com/c09sb.gif。只需单击一次即可出现此问题 ‍♂️。 - Mojtaba Hosseini
看起来你一次激活了很多链接。看看这个主题 - 在视觉上你有类似的情况。 - Asperi
看起来是 .listStyle(GroupedListStyle()) 导致了这个问题。 - Mojtaba Hosseini

0
您可以尝试使用 Button 而不是 NavigationLink,并替换您的主视图:
struct ContentView: View {
    @State var showSlaveView = false

    var body: some View {
        NavigationView {
            masterView
                .navigationBarTitle("Master view")
            Text("Detail view")
                .navigationBarTitle("DO NOT show the slave view here")
        }
    }
}

extension ContentView {
    @ViewBuilder
    var masterView: some View {
        if showSlaveView {
            SlaveView()
                .onTapGesture { self.showSlaveView = false }
        } else {
            Button("Show the slave view HERE") {
                self.showSlaveView = true
            }
        }
    }
}

这个想法很好。但它会破坏所有的导航转换、标题转换、返回按钮、滑动手势等等。而且,在复杂的应用程序中,主列表和从列表都是复杂的。那怎么办? - Mojtaba Hosseini
@MojtabaHosseini 但这意味着同时打开两个 NavigationLink。从主页面打开从页面,但细节已经打开(也是从主页面)。我认为 SwiftUI 导航栈目前不允许这样做。 - pawello2222
我需要类似于:在左侧保留列表,在右侧保留详细信息。但是我也像你一样,不幸的是。 - Mojtaba Hosseini

-1

您可以尝试使用StackNavigationViewStyle()

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink("Show the slave view HERE", destination: SlaveView())
                .navigationBarTitle("Master view")
            
            Text("Detail view")
                .navigationBarTitle("DO NOT show the slave view here")
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

这会杀死整个SplitView,而我不想要那样。我认为你误解了问题。 - Mojtaba Hosseini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接