我刚开始学习SwiftUI,我想在SwiftUI中的一个VIEW中添加一个Timer,为什么我不能更新“SomeTEXTinVIEW”,我不明白什么错误,我如何更新一个不在Colsure中的@State变量
不能在属性初始值设定项中使用实例成员“SomeTEXTinVIEW”;属性初始值设定项在“self”可用之前运行
@State var SomeTEXTinVIEW: String = "NoValue"
var timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { _ in
SomeTEXTinVIEW = String("Example Result") // With Error, can not update
}
....跟进....
本来打算Timer可以暂停的。我更改了 Marcy 建议的代码,但出现错误。请告诉我哪里出错了。在此先感谢您的帮助。
struct ContentView: View {
@State var someTextInView: Int = 0
var timer = Timer() // Comment this line !!!
@State var timer = Timer()
var body: some View {
VStack {
Text(String(someTextInView))
Button("Re-Start", action: {
timer.fireDate = Date.init(timeIntervalSinceNow: 0.01)})
Button("Pause / Stop", action: {
timer.fireDate = Date.distantFuture
timer.invalidate() // Comment this line !!!
})
}
.onAppear {
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
someTextInView += 1
}
}
}
}
以下是没有错误的可执行文件(仅供参考)
struct ContentView: View {
@State var someTextInView: Int = 0
var body: some View {
Text(String(someTextInView))
.onAppear {
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
someTextInView += 1
}
}
}
}
产生的错误是:
不能在属性初始值设定项中使用实例成员“SomeTEXTinVIEW”;属性初始化程序在“self”可用之前运行
定时器属性不能使用SomeTEXTinVIEW,因为它还没有被创建。结构(以及类和枚举)是属性和方法的无序列表。因此,在这种情况下,结构的属性声明不能依赖于另一个结构属性的存在。
但是定时器可以这样执行:
struct ContentView: View {
@State var someTextInView: String = "NoValue"
var body: some View {
Text(someTextInView)
.onAppear {
Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { _ in
someTextInView = "Example Result"
}
}
}
}
我建议将属性 SomeTEXTinVIEW 写成像这样的 someTextInView 的驼峰式大小写。这是 Swift 中公认的样式,将使代码更易于阅读,因为它有助于区分属性和类型。
不需要将“示例结果”转换为字符串,因为它已经是一个字符串。