在SwiftUI中,当按钮被按下时更改字符串文本

3
我正在尝试弄清楚在SwiftUI中按下按钮时如何更改字符串的文本。
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
           let title = Text("Button Not Clicked")
                .font(.title)
                .fontWeight(.heavy)
                .foregroundColor(.red)
                .padding()
                .frame(height: 0.0)
        }
        
        Button(action: {
            title.text = "Button Clicked!"
        }) {
            Text("Click Here")
        }
    }
    
    
}

到目前为止,我已经尝试使用'title.text = (string)'更改字符串,但这并不起作用。有什么想法吗?
1个回答

3

不要在body属性中声明字符串,而是可以将其声明为ContentView上的@State var buttonTitle: String = "Button Not Clicked"。然后只需要在action闭包中添加buttonTitle = "Button Clicked"即可。

import SwiftUI

struct ContentView: View {
    @State var buttonTitle: String = "Button Not Clicked"
    var body: some View {
        VStack {
           Text(buttonTitle)
                .font(.title)
                .fontWeight(.heavy)
                .foregroundColor(.red)
                .padding()
                .frame(height: 0.0)

            Button(action: {
                buttonTitle = "Button Clicked!"
            }) {
                Text("Click Here")
            }
        }
        

    }
    
    
}

在SwiftUI中,你的body属性将在每次视图更新时被重新计算,而不是像UIKit那样尝试访问标签并更改其字符串。

额外的例子展示了多个字符串被存储在字典中:

struct ContentView: View {
    @State var labels: [String : String] = [
        "header" : "This Is the header!",
        "donger" : "",
        "footer" : "Here's the footer."
        
    ]
    
    var body: some View {
        VStack {
            Text(labels["header"]!)
            Text(labels["donger"]!)
            Text(labels["footer"]!)
            
            Spacer()
            
            Button("Update") {
                updateDonger()
            }
        }
    }
    
    func updateDonger() {
        labels["donger"] = #"╰( ͡° ͜ʖ ͡° )つ──☆*:・゚"#
    }
}

如果我想在VStack中拥有多个可编辑的文本元素,我需要将每一个声明为@State变量吗? - Piie.
@Piie。如果你有新的问题,请创建另一个帖子。如果你的原始问题已经得到回答,请参阅当有人回答我的问题时我该怎么办? - pawello2222
你可能会想为每个字符串使用单独的@State变量,但你也可以使用一个字符串字典。我可以更新示例,展示如何使用字典。还有其他几种方法可以选择,比如使用ObservableObject来创建视图模型。不过这超出了本问题的范围。 - Sparklebeard
@Sparklebeard 请用字典展示一下 :DD: - lorenzo gonzalez

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