SwiftUI @State 更改正在显示的图像

Posted

技术标签:

【中文标题】SwiftUI @State 更改正在显示的图像【英文标题】:SwiftUI @State to change an Image being displayed 【发布时间】:2020-01-29 16:44:20 【问题描述】:

我有一个通过读取 JSON 数据创建的字典,我正在使用这些变量名称来填充其他视图。

所以我有 var charFullDetail: charDetail

这会返回许多变量,但我感兴趣的两个是: charFullDetail.cardFrontImage charFullDetail.cardBackImage

这些包含相当于保存在资产目录中的图像的字符串。

我的视图然后使用这些变量来显示图像

Image(charFullDetail.cardFrontImage)

这很好用。

我想要做的是将上面的图像变成动态的东西,以便点击它或按下按钮,图像显示相反的图像。

因此,如果正在显示 .cardFrontImage 并且我点击图片,我希望它用它替换图片 Image(charFullDetail.cardBackImage

我无法让执行此操作的代码正常工作 - 我的想法是创建一个 @State 变量并在 Image() 中使用它,以便如果该变量被更改,则 Image() 会更新。

但如果我这样做 @State var card = "charFullDetail.cardFrontImage"

然后尝试使用 Image(card)

它失败了,因为它找不到图片,因为它使用文字字符串作为字符串而不是引用该变量的值 - 如果这有意义的话。

基本上,我如何才能将引用 charFullDetail.cardFrontImage 替换为有状态变量,但让它仍然引用该值而不将其视为字符串“charFullDetail.cardFrontImage”?

【问题讨论】:

【参考方案1】:

将状态用作字符串对我有用。你确定你的资产没有问题吗?试试这个 Playground,它使用 SFSymbols 提供的系统图像,然后放入您自己的图像:

import SwiftUI
import PlaygroundSupport


struct V: View 
  @State var imageName = "star"

  var body: some View 
    VStack 
      Image(systemName: self.imageName)
      Button("tap me") 
        self.imageName = self.imageName == "star" ? "star.fill" : "star"
      
    
  


PlaygroundPage.current.setLiveView(UIHostingController(rootView: V()))

【讨论】:

我的问题是我正在使用来自另一个结构的值,该结构包含我想要传递给 Image() 以显示的字符串。 所以当我调用 Image(self.charFullDetailA.cardFrontImage) // 这实际上是一个数组键,其值为 AgathaV2.jpg 如果我尝试创建一个 sring 类型的状态变量并分配字符串 var test = self.charFullDetailA.cardFrontImage 然后尝试执行 Image(test) 而不是从字典中获取值正在尝试实际加载名为 self.charFullDetailA.carfFrontImage 的图像 - 这当然不是资产中加载的图像。 你的意思是你有一个 UIImage 而不是一个字符串?使用另一个初始化器Image(uiImage: myImage)developer.apple.com/documentation/swiftui/image/3269665-init

以上是关于SwiftUI @State 更改正在显示的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中更改 @State 值?

在SwiftUI中点击watchOS应用程序时如何更改图像

iOS 15 SwiftUI 3 Picker 绑定在更改@State 值后不起作用

深度解析:为何在 SwiftUI 视图的 init 初始化器里无法更改 @State 的值?

深度解析:为何在 SwiftUI 视图的 init 初始化器里无法更改 @State 的值?

值更改时如何在 UIKit 中更新 SwiftUI 视图?