在 Swift UI 的布尔语句中使用状态变量

Posted

技术标签:

【中文标题】在 Swift UI 的布尔语句中使用状态变量【英文标题】:Using a State Variable in Boolean Statement in Swift UI 【发布时间】:2020-11-14 09:10:51 【问题描述】:

我在 swiftUI 视图中有一个状态变量 @State private var value: Int。当我在像 value == 10 这样的布尔语句中使用该状态时,如果传递给第二个视图,它不会更新。

例如,下面的高亮显示永远不会改变:

struct TestView: View 

   @State private var value = 5
   var body: some View 
    
       Button("update value") 
           withAnimation  value = value + 5 
       
    
       Text("\(value)").padding()

       MyTestView(highlighted: value == 5).padding()
       MyTestView(highlighted: value == 10).padding()
       MyTestView(highlighted: value == 15).padding()
   


struct MyTestView: View 
   @State var highlighted: Bool = false

   var body: some View 
       Text("test")
          .background(highlighted ? Color.red : Color.white)
   

【问题讨论】:

您对问题的第二次编辑与白天和黑夜不同!你问了一个多么确切的问题! 【参考方案1】:

来自 Apple 开发者文档:

SwiftUI 管理您声明为状态的任何属性的存储。当状态值发生变化时,视图会使其外观无效并重新计算主体。使用状态作为给定视图的唯一真实来源。

因此,当您的 State 包装值更改时,将重新计算正文。在上面的示例中,您没有显示任何会改变您的 State 值的内容。第一次创建视图时,编译器将检查变量“值”的第一个值,然后相应地设置文本。要更新该文本,您必须更改 State 变量。

Button(action: 
    //Here you update your State variable, which will force the body to recalculate
    self.value = 15
)

    Text("Update variable")

编辑:

正如您现在发布代码一样,这里是解决方案。您无需在您的MyTestView 中将highlighted 声明为State。只需将其声明为var,它就会起作用。正如 Apple 所说,将您的 State 值声明为私有,而不是从外部更改它们。在这里,在您的示例中,状态不正确,因为您没有从体内更改该值。

struct MyTestView: View 
   var highlighted: Bool = false

   var body: some View 
       Text("test")
          .background(highlighted ? Color.red : Color.white)
   

编辑以显示使用绑定的解决方案

有一个使用绑定的解决方案,但是这会改变你的逻辑,并且在你的用例中它并不是真正必要的,正如评论中讨论的那样:

struct ContentView: View 

    @State private var value = 5
    var body: some View 
    
        Button("update value") 
            withAnimation  value = value + 5 
        
    
        Text("\(value)").padding()

        MyTestView(highlighted: $value, border: 5).padding()
        MyTestView(highlighted: $value, border: 10).padding()
        MyTestView(highlighted: $value, border: 15).padding()
   


struct MyTestView: View 
    @Binding var highlighted: Int
    var border : Int

    var body: some View 
        Text("test")
            .background(highlighted == border ? Color.red : Color.white)
    

会给你同样的效果,但不是很好

【讨论】:

@davidev,绑定将是正确的答案,而不是你在这里回答的!这是错误的答案!我不知道你的答案怎么可能是正确的答案! @Omid 我不知道你为什么会在这种情况下使用绑定。您没有更改 MyTestView 中的值。来自 Apple 文档:“使用绑定在存储数据的属性与显示和更改数据的视图之间创建双向连接。”如果您要更改 MyTestView 中的值并希望更新您的父视图,您将使用 Binding。就像一个切换按钮,它将状态的更新发送给他们的父母 @davidev,看看他为渲染视图提供的代码,值 == 5,值 == 10,值 == 15!您对 Binding 的解释并不完整,请查看苹果网站以获取更多信息,如果他只是按时致电 MyTestView 并且之后不需要更新该视图,我可以理解您的答案,但是正如您所见,他开始更改TestView 中突出显示的值!这意味着 MyTestView 也应该自我更新!您对 Binding 的理解是错误的,“创建双向连接”是 Binding 的一部分,不是全部 @Omid 我非常感谢您的努力并愿意帮助我!多谢。但我不得不承认,我展示的代码只是演示我遇到的问题的一个示例。实际上,子视图确实无法控制它是否突出显示。这就是我使用 State 而不是 Binding 的原因。所以在我的特殊情况下,我仍然认为这是正确的答案。 同样在这个平台上,您最好快速做出决定。就在一个小时内,我注意到我最初的示例很糟糕,并提出了一个改进的示例,我收到了足够多的不喜欢和关闭请求,以便在它关闭之前更好地快点 ^^

以上是关于在 Swift UI 的布尔语句中使用状态变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 的布尔数组中找到多个 True 语句

在swift 3中保存变量和布尔值[关闭]

Swift UI笔记

如何在 Swift 中使用计时器切换布尔值

什么是布尔类型

用于多重过滤 Swift 的布尔语句