为什么 EmptyView() 不能在带有 SwiftUI 的 WatchOS 上运行?
Why doesn't EmptyView() work on WatchOS with SwiftUI?
NavigationView()
在 swiftUI 下的 WatchOS 上不起作用,但我发现了一个巧妙的技巧(?)here 让 NavigationView 在 WatchOS 上工作。添加这个允许在 watchOS 项目
中使用 NavigationView()
#if os(watchOS)
struct NavigationView<Content: View>: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
VStack(spacing: 0) {
content()
}
}
}
#endif
问题是,我想用来从函数(如按钮)弹出新视图的方法需要一个显示 EmptyView()
的 NavigationLink,而该方法适用于 iOS它不适用于 WatchOS。
iOS 上的工作代码:
import SwiftUI
struct ContentView: View {
@State var showNewView = false
var body: some View {
NavigationView{
VStack {
NavigationLink(destination: Text("This text view"), isActive: self.$showNewView) {EmptyView()}
Button("Not the world!") {
self.showNewView = true
}
Text("Hello, World!")
}
}
}
}
如果您将该代码放入新的 WatchOS 应用程序中,并包含相关代码片段以使 NavigationView 在 WatchOS 上运行,则允许创建应用程序,但更改视图的按钮不会执行任何操作。
它将变量 showNewView
更改为 true(我已经通过 print
语句进行了测试)但是变为 true 不会显示新视图。
如果我在其中放置一个非空视图(类似于 Text("Merry Christmas")
),它将起作用。
我目前正在寻找另一种解决方案来解决我的问题,即通过一个函数(而不是通过使用 NavigationView 制作某种列表)获取要在 SwiftUI 中显示的新视图,但我很好奇发生了什么。我认为它与用于让 NavigationView 在 WatchOS 上工作的 hack 有关,但我真的不知道该代码片段是如何工作的。
这是一个解决方案 - 只需将导航 link 置于后台即可。
使用 Xcode 11.4
测试
VStack {
Button("Not the world!") {
self.showNewView = true
}
.background(NavigationLink(destination: Text("This text view"),
isActive: self.$showNewView) {EmptyView()} )
Text("Hello, World!")
}
NavigationView()
在 swiftUI 下的 WatchOS 上不起作用,但我发现了一个巧妙的技巧(?)here 让 NavigationView 在 WatchOS 上工作。添加这个允许在 watchOS 项目
NavigationView()
#if os(watchOS)
struct NavigationView<Content: View>: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
VStack(spacing: 0) {
content()
}
}
}
#endif
问题是,我想用来从函数(如按钮)弹出新视图的方法需要一个显示 EmptyView()
的 NavigationLink,而该方法适用于 iOS它不适用于 WatchOS。
iOS 上的工作代码:
import SwiftUI
struct ContentView: View {
@State var showNewView = false
var body: some View {
NavigationView{
VStack {
NavigationLink(destination: Text("This text view"), isActive: self.$showNewView) {EmptyView()}
Button("Not the world!") {
self.showNewView = true
}
Text("Hello, World!")
}
}
}
}
如果您将该代码放入新的 WatchOS 应用程序中,并包含相关代码片段以使 NavigationView 在 WatchOS 上运行,则允许创建应用程序,但更改视图的按钮不会执行任何操作。
它将变量 showNewView
更改为 true(我已经通过 print
语句进行了测试)但是变为 true 不会显示新视图。
如果我在其中放置一个非空视图(类似于 Text("Merry Christmas")
),它将起作用。
我目前正在寻找另一种解决方案来解决我的问题,即通过一个函数(而不是通过使用 NavigationView 制作某种列表)获取要在 SwiftUI 中显示的新视图,但我很好奇发生了什么。我认为它与用于让 NavigationView 在 WatchOS 上工作的 hack 有关,但我真的不知道该代码片段是如何工作的。
这是一个解决方案 - 只需将导航 link 置于后台即可。
使用 Xcode 11.4
测试VStack {
Button("Not the world!") {
self.showNewView = true
}
.background(NavigationLink(destination: Text("This text view"),
isActive: self.$showNewView) {EmptyView()} )
Text("Hello, World!")
}