SwiftUI中如何在不修改第三方包中子视图的前提下,仅通过修改ContentView实现子视图重绘?
解决方案
问题的核心在于第三方StarView里的ForEach使用了0..<count这种Range类型作为数据源,SwiftUI对Range的变更检测存在局限,导致count变化时无法自动触发子视图刷新。由于我们不能修改第三方代码,只需要在ContentView中给StarView添加一个动态标识,强制SwiftUI在count变化时重新渲染子视图即可。
修改后的ContentView代码如下:
struct ContentView: View { @State var count: Int = 5 var body: some View { VStack { Stepper("Count", value: $count, in: 0...10) // 添加.id(count),让count变化时重新创建StarView StarView(count: $count) .id(count) } .padding() } }
原理说明
.id(count)修饰符会给StarView绑定一个唯一标识,每当count的值改变,这个标识就会跟着变化。SwiftUI会认为这是一个全新的视图实例,从而重新初始化并渲染StarView,这样里面的ForEach就会基于新的count值生成对应数量的星星了。
这个方法不需要修改任何第三方代码,完全在ContentView中完成,完美适配你的需求。
内容的提问来源于stack exchange,提问作者BigCom Ren
相关产品推荐
相关产品推荐

