带有计时器的 SwiftUI

问题描述 投票:0回答:1

我刚开始学习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
        }
    }
}

}

swiftui view timer
1个回答
0
投票

产生的错误是:

不能在属性初始值设定项中使用实例成员“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 中公认的样式,将使代码更易于阅读,因为它有助于区分属性和类型。

不需要将“示例结果”转换为字符串,因为它已经是一个字符串。

© www.soinside.com 2019 - 2024. All rights reserved.