使用本地 JSON 中的键:值更改按钮/标签文本 - SwiftUI

Posted

技术标签:

【中文标题】使用本地 JSON 中的键:值更改按钮/标签文本 - SwiftUI【英文标题】:Change button/label text using key:value from local JSON - SwiftUI 【发布时间】:2021-02-06 03:33:25 【问题描述】:

SwiftUI 的新手。当用户按下按钮时,尝试获取 JSON 键:值数组以更新到下一个随机项。让它加载就好了,但按钮什么也没做。尝试制作洗牌功能,但找不到将新值传递到文本区域的方法。还尝试将我的 decodedQuotes 和 quote 变量放入 View 中的 @State vars,但它们在 self 可用之前初始化。

通常可以调用 touchesBegan 并在 Storyboard 中编写一个简单的函数。我可以在这里做类似的事情吗?

var decodedQuotes = Bundle.main.decode([Quote].self, from: "quotes.json")
// parses an array with "quote":"name" pairs
var quote = decodedQuotes.randomElement()!

struct QuoteView: View 
    var body: some View 
        
        Button(action:
            // Need it to update the Text below with a new random item from quote
        )
        HStack 
            VStack 
                HStack(alignment: .center) 
                    Text(quote.quote)
                        .multilineTextAlignment(.center)
                        .padding()
                        .foregroundColor(.black)
                
                HStack 
                    Text("-\(quote.name)")
                        .foregroundColor(.black)
                
            
            
        
        .frame(width: 300, height: 300, alignment: .center)
        .background(Background(isHighlighted: true, shape: Rectangle()))
        .foregroundColor(.blue)
        .padding(4)
        .cornerRadius(20)
    

【问题讨论】:

【参考方案1】:

您与@State 走在正确的轨道上

struct Quote 
    var quote : String
    var name : String


var decodedQuotes = [Quote(quote: "test1", name: "name1"),
                     Quote(quote: "test2", name: "name2"),
                     Quote(quote: "test3", name: "name3"),]

struct QuoteView: View 
    
    @State var quote : Quote? = decodedQuotes.randomElement()
    
    var body: some View 
        Button(action: 
            quote = decodedQuotes.randomElement()
        ) 
            Text("New quote")
        
        
        if let quote = quote 
            HStack 
                VStack 
                    HStack(alignment: .center) 
                        Text(quote.name)
                            .multilineTextAlignment(.center)
                            .padding()
                            .foregroundColor(.black)
                    
                    
                    HStack 
                        Text("-\(quote.name)")
                            .foregroundColor(.black)
                    
                
            
            .frame(width: 300, height: 300, alignment: .center)
            .foregroundColor(.blue)
            .padding(4)
            .cornerRadius(20)
        
    

显然,为了测试,我只是使用了一组预制的Quotes

如果您愿意,您也可以在QuoteView 上创建decodedQuotes 一个@State 属性,并在onAppear 中解码它们

我现在还选择将quote 设为可选。我通过if let quote = quote 行检查它是否可用。如果您在某个时候开始从其他地方加载报价,这应该有点面向未来。

【讨论】:

【参考方案2】:

我相信这是当前 SwiftUI 中更好的实现,其中文本实际上在按钮内发生变化。希望对你有帮助>

   import SwiftUI
        
struct Quote 
        var quote : String
        var name : String
    
    
    var decodedQuotes = [Quote(quote: "Title 1", name: "Description 1."),
                         Quote(quote: "Title 2", name: "Second description."),
                         Quote(quote: "Title 3", name: "final item."),]
    
    struct ContentView: View 
        
        @State var quote : Quote? = decodedQuotes.randomElement()
        
        var body: some View 
            Button(action: 
                quote = decodedQuotes.randomElement()
            ) 
                Text("New quote")
                
                
                if let quote = quote 
                    HStack 
                        VStack 
                            VStack(alignment: .center) 
                                Text(quote.quote)
                                    .multilineTextAlignment(.center)
                                    .padding()
                                    .foregroundColor(.blue)
                                Text("-\(quote.name)")
                                    .foregroundColor(.blue)
                            
                            
                            
                        
                    
                    .frame(width: 300, height: 300, alignment: .center)
                    .foregroundColor(.blue)
                    .padding(4)
                    .cornerRadius(20)
                
            
            
        
        
    
        struct ContentView_Previews: PreviewProvider 
            static var previews: some View 
                ContentView()
            
        

【讨论】:

以上是关于使用本地 JSON 中的键:值更改按钮/标签文本 - SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

忽略 Xcode 的“本地化导出”中的一些文本

在 iOS 中使用按钮更改标签的文本

单击表格视图中的按钮时如何更改表格视图外部的标签文本

使用 jq 就地修改 json 中的键值

如何在iOS swift的tableview中使用json响应中的键和值?

js中json方法加载的问题