SwiftUI @State 在放入 NavigationView(macOS 应用程序)时仅更新一次

Posted

技术标签:

【中文标题】SwiftUI @State 在放入 NavigationView(macOS 应用程序)时仅更新一次【英文标题】:SwiftUI @State is updated only once when put inside NavigationView (macOS app) 【发布时间】:2020-09-14 04:43:32 【问题描述】:

问题

我在 NavigationView 中放置了一个增加计数器的简单按钮,但应用程序似乎只更新了一次 @State 值;稍后的点击被忽略。在 NavigationLink 之间切换会导致视图更新,但是为什么在 counter 发生更改后它不会自动更新?

事实

otherView 在我将其放在导航视图之外后可以正常工作。

代码

import SwiftUI

struct ContentView: View 
    
    @State var counter = 0
    
    var otherView: some View 
        Button(action: 
            counter += 1
        , label: 
            Text(String(counter))
        ).frame(maxWidth: .infinity, maxHeight: .infinity).padding()
    
    
    var body: some View 
        HStack 
            NavigationView 
                List 
                    NavigationLink("otherview", destination: otherView)
                .listStyle(SidebarListStyle())
            
        .frame(minWidth: 500, minHeight: 400)
    

【问题讨论】:

【参考方案1】:

尝试将otherView 移动到单独的 SwiftUI 视图中,如下所示:

struct ButtonView: View 
    
    @State var counter = 0
    
    var body: some View 
        Button(action: 
            counter += 1
        , label: 
            Text(String(counter))
        ).frame(maxWidth: .infinity, maxHeight: .infinity).padding()
    
    

然后在你的ContentView 中这样称呼它:

struct ContentView: View 
       
    var body: some View 
        HStack 
            NavigationView 
                List 
                    NavigationLink("otherview", destination: ButtonView())
                .listStyle(SidebarListStyle())
            
        .frame(minWidth: 500, minHeight: 400)
    

【讨论】:

工作,但在我将ButtonView 中的@Binding 替换为@State 之后。谢谢!

以上是关于SwiftUI @State 在放入 NavigationView(macOS 应用程序)时仅更新一次的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中用另一个 @State 属性值初始化 @State 属性

SwiftUI 按钮的可触摸区域

为 Swiftui 视图转换 @State 的计算属性

SwiftUI @State 变量未更新

SwiftUI - @State 属性未更新

在 SwiftUI 中使用 @State 属性包装器未更新视图