为啥 EmptyView() 不能在带有 SwiftUI 的 WatchOS 上工作?

Posted

技术标签:

【中文标题】为啥 EmptyView() 不能在带有 SwiftUI 的 WatchOS 上工作?【英文标题】:Why doesn't EmptyView() work on WatchOS with SwiftUI?为什么 EmptyView() 不能在带有 SwiftUI 的 WatchOS 上工作? 【发布时间】:2020-06-21 17:46:38 【问题描述】:

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 应用程序中,并包含相关代码 sn-p 以使 NavigationView 在 WatchOS 上工作,它允许创建应用程序,但更改视图的按钮不会执行任何操作。

它会将变量 showNewView 更改为 true(我已经通过 print 语句进行了测试)但变为 true 不会显示新视图。

如果我在其中放置一个非空视图(类似Text("Merry Christmas")),它将起作用。

我目前正在寻找另一种解决方案来解决我的问题,即通过函数(而不是通过使用 NavigationView 制作某种列表)在 SwiftUI 中显示新视图,但我很好奇发生了什么。我认为这与用于让 NavigationView 在 WatchOS 上运行的黑客行为有关,但我真的不知道该代码 sn-p 是如何工作的。

【问题讨论】:

【参考方案1】:

这是一个解决方案 - 只需将导航链接置于后台即可。

使用 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!")

【讨论】:

以上是关于为啥 EmptyView() 不能在带有 SwiftUI 的 WatchOS 上工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 VStack 不能在带有滚动视图的 GeometryReader 中工作?

为啥我们不能在c中创建一个带有常量的数组[重复]

为啥不能在 bash 4.1.2 中访问带有破折号的环境变量?

为啥我的数据不能在带有 SIGNAl/SLOT 的表格之间传输?

为啥我不能在 JavaScript/ES6 中使用带有箭头函数的`new`? [复制]

为啥我的带有@EmbeddedId 的实体不能在其对应的@Embeddable 类中使用LocalDateTime?