在SwiftUI中更改布尔值时无法使按钮文本更改

5

我希望有一个按钮,当点击时可以切换布尔值并更改按钮的文本。通过使用打印语句,我可以确认按钮正常切换了布尔值,但它没有改变按钮的文本。

我尝试手动将布尔值默认值设置为false,这确实改变了文本,但是我仍然无法在切换时更改文本。

Button(action: {
                Variables.userTriangle.cupShooting = 7
                Variables.userTriangle.triangle[6].toggleStatus()
            }) {
                if !Variables.userTriangle.triangle[6].status {
                    Text("x")
                        .font(.largeTitle)
                } else {
                    Text("7")
                        .font(.largeTitle)
                }
            }

当按下按钮时,我希望它通过改变布尔值来改变文本的值。我计划有多个这样的按钮。

2个回答

16

我认为视图只构建一次,所以它不会每次更改时都检查那个条件...

你可以将文本设置为@State变量,然后当你更改它时,它会自动在视图中更新。

@State var someText = "x"

...

Button(action: {
                Variables.userTriangle.cupShooting = 7
                Variables.userTriangle.triangle[6].toggleStatus()
                if (Variables.userTriangle.triangle[6].status) {
                   self.someText = "7"
                } else {
                   self.someText = "x"
                }
            }) {
                Text(self.someText).font(.largeTitle)

            }


谢谢。我能够使用那种方法让它工作。然而,我计划拥有多个按钮具有这种行为,每个按钮都有不同的文本(约20个),是否有一种更有效的方法来做到这一点,而不是为每个按钮创建变量? - Thomas Braun
@ThomasBraun 很高兴它起作用了,不幸的是我还没有玩过太多的SwiftUI,不知道有没有更好的方法来做你需要的事情。 - Quinn

1
较简单的方法是:

Button(action: {
            Variables.userTriangle.cupShooting = 7
            Variables.userTriangle.triangle[6].toggleStatus()
        }) {
            Text(Variables.userTriangle.triangle[6].status ? "7" : "x")
        }

抱歉,我对Xcode/SwiftUI还不熟悉。那个带有问号和冒号的格式是否基本上根据布尔值的不同来执行两种不同的操作? - Thomas Braun
@ThomasBraun 这是一个三元运算符,在许多编程语言中使用 - 如果是真的则执行第一项,否则执行 : 后面的事情。 - Quinn
只是想让你知道,我尝试了那种方法,但它没有起作用。我认为这是因为Quinn在他的回复中所说的原因,但SwiftUI只构建一次,因此它不会重新检查if条件的状态。还是很感谢你教我三元运算符。 - Thomas Braun
在SwiftUI中声明的视图会在标记为State、Binding或ObservedObject的变量值改变时重新绘制。为了使其更有效率,只有那些外观依赖于这些变量的元素才会被重新绘制。我认为问题出在您声明数组的方式上。 - LuLuGaGa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接