Swiftui 将导航栏项目中导航链接的目标强制到辅助/详细视图

Swiftui 将导航栏项目中导航链接的目标强制到辅助/详细视图,swiftui,Swiftui,我试图在SwiftUI中重现UISplitViewController的行为,特别是在iPad上。此SwiftUI代码的行为与我预期的不同: struct ContentView: View { var body: some View { NavigationView { VStack { Text("Master") }.navigationBarItems(trailing: Naviga

我试图在SwiftUI中重现UISplitViewController的行为,特别是在iPad上。此SwiftUI代码的行为与我预期的不同:

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack {
                Text("Master")
            }.navigationBarItems(trailing: NavigationLink(destination: DetailView()) {
                Image(systemName: "plus")
            }).navigationBarTitle("Master List")
            Text("")
        }
    }
}

struct DetailView: View {
    var body: some View {
        Text("Detail")
    }
}
在iPhone设备上,它可以正常工作。点击导航栏中的加号按钮,将DetailView推到导航堆栈上,一切看起来都很好

在iPad上,plus将细节视图推到主视图中的导航堆栈上。即使我明确地告诉它链接应该使用isDetailLink true以细节为目标,它也会这样做

Bug还是我做得不对


这就忽略了第二个问题,即如何避免在点击目标视图之前对其进行评估。例如,当目标视图将一个参数作为空模型,并且创建该模型会产生副作用(例如,将对象插入托管对象上下文)时,这是理想的。很好地解释了这种情况。

请注意,在大型iPhone上,当处于横向时,您会看到同样的问题

在我看来,IsDetailLink真的应该有用。这可能是一个影响导航栏的bug。我见过很多奇怪的行为。无论你在导航栏中放置什么,都会丢失某种上下文

到目前为止,我找到的解决方法是使用导航栏的操作来触发主视图中的某些内容。在本例中,NavigationLink现在位于主视图中,但不可见。请注意,我将它放在了.background中,这样它就不会影响其他视图的布局

结构ContentView:View{ @国家私有var push=false var body:一些观点{ 导航视图{ VStack{ 文本巨匠 .backgroundNavigationLinkdestination:DetailView,isActive:$push{EmptyView} }.navigationBarItemstrailing: 按钮操作:{self.push=true},标签:{ ImagesystemName:plus } .navigationBarTitleMaster列表 文本 } } } 结构详细视图:视图{ var body:一些观点{ 文本细节 } } 最后,请注意NavigationLink中有一个bug也会影响您。幸运的是,还有一个解决方法:

导航链接需要位于列表中,请尝试以下操作:

import SwiftUI

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

struct DetailView: View {
    var body: some View {
        Text("Detail Label").navigationBarTitle("Detail")
    }
}

这很管用,但感觉很粗糙。我同意这可能是一个错误。我提交了FB7201467号文件;我将看看苹果对此有何评论。不过,我明确不想把addnewthing控件放在列表中。多年来,iOS的惯例是在导航栏中有一个+按钮来添加新内容。如果SwiftUI现在不能做到这一点,那也没关系,但我希望他们能解决这个缺点。啊,好吧,这还不清楚。在这种情况下,点击add nav bar(添加导航栏)按钮应显示一个模式视图控制器,不显示详细信息,或者如果该项目只是一个文本字段,则可以使用警报,例如,如果它是文件夹标题,最后您可以将新项目添加到列表中,然后通过编程选择它,然后,如果他们从未完成的项目返回或取消,您可以再次删除它,就像在返回时保留为空的Notes中的新备注发生的情况一样。