当前位置:网站首页>一行代码解决CoreData托管对象属性变更在SwiftUI中无动画效果的问题
一行代码解决CoreData托管对象属性变更在SwiftUI中无动画效果的问题
2022-07-31 23:31:00 【大熊猫侯佩】

概述
在CoreData后台支持的SwiftUI项目中,为了简化实现,我们可以直接用托管对象的属性作为SwiftUI视图状态改变的驱动器。
不过,这样做可能会导致托管对象属性改变时没有动画效果:

如上图所示,通知时间面板视图的展开是由CoreData托管对象的属性变更触发的,但我们即使在代码中用 withAnimation 块包裹属性变更代码,仍然没有动画效果。
如何解决呢?
其实,只需一行代码即可搞定!
So,别再等待,Let‘s Fix It!
一行代码!
首先,来看一下源代码:
extension Item {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Item> {
return NSFetchRequest<Item>(entityName: "Item")
}
@NSManaged public var enableNotify: Bool
}
struct ItemInfoView: View {
@EnvironmentObject var item: Item
var body: some View {
VStack {
Button(action: {
withAnimation {
// 变更托管对象item的enableNotify属性
item.enableNotify.toggle()
}
model.moc.saveIfNeed()
}){
Image(systemName: "bell.circle")
.foregroundColor(item.enableNotify ? .blue : .gray)
}
if item.enableNotify {
// 显示提醒时间面板...
}
}
}
}
虽然我们将item对象用 @EnvironmentObject 修饰,希望可以有动画反馈,但实际并没有任何事情发生。
其实,遇到这种情况,我们只需显式托管对象本身发送变更通知即可。
因为CoreData的任何托管类都遵守ObservableObject协议,即它的实例都包含一个名为objectWillChange的发布器对象,我们只需让其发送消息,即可驱动SwiftUI视图刷新从而产生动画效果:
Button(action: {
withAnimation {
item.enableNotify.toggle()
// 显式刷新界面,触发动画
item.objectWillChange.send()
}
model.moc.saveIfNeed()
}){
Image(systemName: "bell.circle")
.foregroundColor(item.enableNotify ? .blue : .gray)
}
现在,我们再来看一下运行效果:

久违的动画再次回归,棒棒哒!
题外话
本篇博文所述问题很简单,很快就搞定了!
我们再来聊一个Xcode开发CoreData项目中的小技巧。
一般来说,我们在Xcode中对于CoreData托管类总是采用自动生成的配置方法(即Class Definition):

这时,Xcode会为我们自动生成托管类的定义,有的小伙伴可能想看一下实际生成托管类的代码,却不知何去何从。
这里教大家一招,按住option键,鼠标左键在任意托管对象类名上点击,然后在弹出的浮动小窗口上点击底部蓝色的 托管类名+CoreDataClass.swift 文本:

此时,Xcode会跳转到该托管类的定义文件中去:

最后,鼠标右键点击Xcode托管类文件窗口顶部的文件名,即可展现其实际的存放路径:

点击对应的目录项,即可在Finder中打开。里面存放着所有Xcode自动生成的托管类定义文件。
总结
在本篇博文中,我们仅用一行代码就解决了CoreData托管对象属性变更无法触发SwiftUI视图动画的问题;我们还顺便介绍了如何快速查看Xcode自动生成CoreData托管类的定义文件。
小伙伴们是不是觉得很简单呢?
最后,感谢大家观赏,再会!
边栏推荐
- #yyds dry goods inventory# Interview must brush TOP101: the entry node of the ring in the linked list
- [QNX Hypervisor 2.2 User Manual]9.16 system
- 面试突击69:TCP 可靠吗?为什么?
- Thinking and Implementation of Object Cache Service
- A high-quality WordPress download site template theme developed abroad
- 如何导入 Golang 外部包并使用它?
- 2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法
- 一文概述:VPN的基本模型及业务类型
- Shell常用脚本:Nexus批量上传本地仓库脚本
- 如何撰写出一篇优质的数码类好物推荐文
猜你喜欢

Audio alignment using cross-correlation

嵌入式开发没有激情了,正常吗?

景区手绘地图的绘制流程

Pytest first experience

(26)Blender源码分析之顶层菜单的关于菜单

硬件设备计算存储及数据交互杂谈

基于mysql的消息队列设计

Unity-LineRenderer显示一条线

2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法

The latest masterpiece!Alibaba just released the interview reference guide (Taishan version), I just brushed it for 29 days
随机推荐
TypeScript 的组件
什么是动态规划,什么是背包问题
Unity-LineRenderer显示一条线
SVN server construction + SVN client + TeamCity integrated environment construction + VS2019 development
HTC使用官方固件作为底包制作rom卡刷包教程
【FPGA教程案例43】图像案例3——通过verilog实现图像sobel边缘提取,通过MATLAB进行辅助验证
无状态与有状态的区别
基于单片机GSM的防火防盗系统的设计
什么是客户画像管理?
mysql having的用法
leetcode:126. 单词接龙 II
Fixed-length usage of nanopb string type based on RT1052 Aworks (27)
Flink 1.13(八)CDC
硬件设备计算存储及数据交互杂谈
Handwritten a simple web server (B/S architecture)
博弈论(Depu)与孙子兵法(42/100)
Pytest初体验
C# Rectangle basic usage and picture cutting
对象缓存服务的思考和实现
How to reduce the gap between software design and implementation