swift - swiftUI:在 onAppear 崩溃中更改 @State
问题描述
如果通过调用服务出现视图,我想设置一个@State 变量。
调用该服务onAppear
会使应用程序崩溃。
在按钮操作中调用服务可以正常工作。
struct ContentView: View {
@State var dirContent : [String] = []
var body: some View {
VStack {
List {
ForEach(dirContent, id: \.self){
fileName in
Text(fileName)
}
}
Button("Get Data"){self.dirContent = Service.getData()}
}
.onAppear{
//self.dirContent = Service.getData2() // Crashes!!
}
}
}
class Service{
static func getData()->[String]{
// ... get Data from somewhere
return ["line1", "line2"]
}
static func getData2()->[String]{
// ... get Data from somewhere
return ["line4", "line5"]
}
}
怎么了?
解决方案
看看为什么会这样,尝试修改你的代码
var body: some View {
VStack {
List {
ForEach(dirContent, id: \.self){
fileName in
Text(fileName).onAppear {
print("item appear")
}
}
}.onAppear {
print("list appear")
}
Button("Get Data"){self.dirContent = Service.getData()}
}
.onAppear{
print("content appear")
DispatchQueue.main.async {
self.dirContent = Service.getData2()
}
}
}
“老派”调试打印向我们展示了
content appear
list appear
item appear
item appear
现在很清楚了,不是吗?
推荐阅读
- javascript - 在 React 中生成一个屏幕外组件并将其变成一个 blob
- javascript - 如何保持 svg 图标处于活动状态,切换选项卡
- cassandra - Cassandra 最佳实践:在 Cassandra 前面添加 Ha Proxy 是个好主意吗?
- react-native - React Native 收入猫与 PlayStore 连接
- ffmpeg - 如何提高 png 到 webm 的 ffmpeg 编码速度?
- postgresql - 为什么它与 ~~ any() 不同?
- angular - Angular/SVG:填充变暗或重叠?
- nuxt.js - 在 Nuxt.js 中有条件地运行 postcss 插件
- swift - 自定义 UIView 中的 UIButton 初始化不可点击
- graphql - 具有静态数据集合的 GraphQl / FaunaDB 模式