将导航栏项目中的 NavigationLink 的目的地强制到 secondary/detail 视图
Forcing the destination of a NavigationLink in a navigation bar item to the secondary/detail view
我正在尝试在 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 上,加号将详细视图推送到 master 视图中的导航堆栈。即使我明确告诉它 link 应该使用 isDetailLink(true)
.
来定位细节,它也会这样做
错误还是我以错误的方式解决这个问题?
(这留下了一个次要问题,即如何避免评估目标 View
直到它被点击。当目标视图采用参数(例如空模型)并创建时,这是可取的该模型有副作用(例如,将对象插入托管对象上下文)。This blog 很好地解释了这种情况。)
请注意,当横向 ()
时,您会在大型 iPhone 上看到同样的问题
isDetailLink(true)
应该有工作(在我看来)。这可能是影响导航栏的错误。我见过很多奇怪的行为。似乎无论您在导航栏中放置什么,都会失去某种上下文。
目前我找到的解决方法是使用导航栏的操作来触发 "main" 视图中的某些内容。在这种情况下,NavigationLink 现在位于主视图中(尽管不可见)。注意,我是放在.background()
里面的,所以不影响其他view的布局。
struct ContentView: View {
@State private var push = false
var body: some View {
NavigationView {
VStack {
Text("Master")
.background(NavigationLink(destination: DetailView(), isActive: $push) { EmptyView() })
}.navigationBarItems(trailing:
Button(action: { self.push = true }, label: {
Image(systemName: "plus")
})
).navigationBarTitle("Master List")
Text("")
}
}
}
struct DetailView: View {
var body: some View {
Text("Detail")
}
}
最后请注意,NavigationLink 中存在一个也会影响您的错误。幸运的是,也有解决方法:
NavigationLink
需要在 List
内,试试这个:
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")
}
}
我正在尝试在 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 上,加号将详细视图推送到 master 视图中的导航堆栈。即使我明确告诉它 link 应该使用 isDetailLink(true)
.
错误还是我以错误的方式解决这个问题?
(这留下了一个次要问题,即如何避免评估目标 View
直到它被点击。当目标视图采用参数(例如空模型)并创建时,这是可取的该模型有副作用(例如,将对象插入托管对象上下文)。This blog 很好地解释了这种情况。)
请注意,当横向 (
isDetailLink(true)
应该有工作(在我看来)。这可能是影响导航栏的错误。我见过很多奇怪的行为。似乎无论您在导航栏中放置什么,都会失去某种上下文。
目前我找到的解决方法是使用导航栏的操作来触发 "main" 视图中的某些内容。在这种情况下,NavigationLink 现在位于主视图中(尽管不可见)。注意,我是放在.background()
里面的,所以不影响其他view的布局。
struct ContentView: View {
@State private var push = false
var body: some View {
NavigationView {
VStack {
Text("Master")
.background(NavigationLink(destination: DetailView(), isActive: $push) { EmptyView() })
}.navigationBarItems(trailing:
Button(action: { self.push = true }, label: {
Image(systemName: "plus")
})
).navigationBarTitle("Master List")
Text("")
}
}
}
struct DetailView: View {
var body: some View {
Text("Detail")
}
}
最后请注意,NavigationLink 中存在一个也会影响您的错误。幸运的是,也有解决方法:
NavigationLink
需要在 List
内,试试这个:
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")
}
}