swiftui - 强制导航栏项目中 NavigationLink 的目标到辅助/详细视图
问题描述
我试图UISplitViewController
在 SwiftUI 中重现 a 的行为,特别是在 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 设备上,它按预期工作。点击导航栏中的加号按钮会将 a 推DetailView
到导航堆栈上,一切似乎都很好。
在 iPad 上,加号将详细视图推送到主视图中的导航堆栈上。即使我明确告诉它链接应该使用isDetailLink(true)
.
错误还是我以错误的方式解决这个问题?
(这留下了一个次要问题,即如何避免在目标View
被点击之前评估目标。当目标视图接受参数(例如,空模型)并且创建该模型具有副作用(将对象插入一个托管对象上下文,比如说)。这个博客很好地解释了这种情况。)
解决方案
请注意,在大型 iPhone 上,横向时您会看到同样的问题 ( https://stackoverflow.com/a/57345540/7786555 )
isDetailLink(true)
应该有工作(在我看来)。这可能是影响导航栏的错误。我已经看到了很多奇怪的行为。似乎您在导航栏中输入的任何内容都会丢失某种上下文。
到目前为止,我发现的解决方法是使用导航栏的操作来触发“主”视图中的某些内容。在这种情况下, NavigationLink 现在位于主视图中(尽管不可见)。注意我把它放在里面.background()
所以它不会影响其他视图的布局。
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 中的一个错误也会影响您。幸运的是,它也有一个解决方法:SwiftUI: NavigationDestinationLink deprecated
推荐阅读
- python - 多继承;不能从 2 个父类调用函数
- git - PhpStorm Git 未通过通用代理连接
- java - 如何在 Windows 中通过命令提示符运行 Junit.Jupiter 代码
- java - 尝试获取并行测试执行的范围报告时获取 NPE
- java - 无法设置 JAVA_HOME GitLab CI
- database - PostreSQL 10 无法在 Linux 的 Windows 子系统上运行的 Ubuntu 18.04 上启动
- peoplesoft - SQR 过程参数/参数
- git - 重置我的最后一次提交撤消许多提交
- python - 如何重新调整 fft 点以获得与解析解相同的结果?
- javascript - 时刻js更改日期时间的日期部分