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 更改正在显示的图像的主要内容,如果未能解决你的问题,请参考以下文章
iOS 15 SwiftUI 3 Picker 绑定在更改@State 值后不起作用
深度解析:为何在 SwiftUI 视图的 init 初始化器里无法更改 @State 的值?