swiftUI结构体数组修改属性UI没更新

SwiftUI使用了值语义,即当数组的值发生更改时,SwiftUI无法检测到具体的更改操作。

要解决这个问题,可以使用SwiftUI中的@State属性包装器来创建一个可观察的状态变量。当数组发生更改时,通过更改状态变量的值来触发列表的更新,但是这种改变仅仅是指数组append一个结构体或remove一个结构体时,页面会增加或减少一个元素

以下场景UI不会更新:

结构体数组直接定义为View的一个@State属性,且结构体遵循了Hashable或Equatable协议并且实现了==静态函数来标识结构体的唯一性

当点击“修改结构体属性”时,页面1就改变了一次颜色,后面一直点击都不改变颜色,说明修改结体数组中某个结构体属性无法更新UI

解决办案:

方案一:去掉结构体的Hashable或Equatable或

static func == (lhs: SettingModel, rhs: SettingModel) -> Bool {

        return lhs.id == rhs.id

    }这个静态函数,去掉了就能更新UI

方案二:如果有些函数要求结构体必须遵循Hashable或Equatable协议,那就用另外一种方式,再单独定义一个Class类型的ViewModel,遵循ObservableObject协议,并将结构体数组定义为@Published类型,然后在View中定义@StateObject类型的viewModel,通过viewModel来引用结构体数组

SwiftUI 中,我们可以使用 `Image(uiImage:)` 来将 `UIImage` 转换成 `Image`,然后在视图中显示。因此,我们可以将一个数组中的多张图片转换为 `Image` 对象,并将它们渲染在视图中。 下面是将一个 `UIImage` 数组转换为 `Image` 对象数组的示例代码: ```swift let images: [UIImage] = [UIImage(named: "image1")!, UIImage(named: "image2")!, UIImage(named: "image3")!] var imageViews: [Image] = [] for image in images { imageViews.append(Image(uiImage: image)) } ``` 此处假设 `image1`、`image2`、`image3` 是项目中的三张图片,它们被存储在一个 `UIImage` 数组中。我们遍历这个数组,将每个 `UIImage` 转换为 `Image`,并将其添加到一个新的 `Image` 数组中。 现在,我们已经将 `UIImage` 数组转换为了 `Image` 数组。接下来,我们可以将这些 `Image` 显示在 SwiftUI 视图中。例如,我们可以使用 `List` 来显示这些图片: ```swift List(imageViews, id: \.self) { imageView in imageView .resizable() .scaledToFit() } ``` 在上面的代码中,我们使用 `List` 来显示图片。我们将 `imageViews` 数组传递给 `List`,并使用 `id` 参数来标识数组中每个元素。在列表项视图中,我们使用 `imageView` 来显示每张图片,并使用 `.resizable()` 和 `.scaledToFit()` 来设置图片的尺寸。 当然,在 SwiftUI 中还有很多其他的方式来将 `UIImage` 数组转换为 `Image` 对象数组,并将它们显示在视图中。上述示例代码仅供参考,可以根据具体的需求进行修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值