繁体   English   中英

为什么这个 swiftui 视图没有更新?

[英]Why does this swiftui view not update?

考虑以下代码块:import SwiftUI

struct MeasurementReading: View, Equatable {

    @ObservedObject var ble: BluetoothConnectionmanager
    @GestureState var isDetectTap = false
    @State var MyText:String = "Wait"

    static func == (lhs: MeasurementReading, rhs: MeasurementReading)->Bool{
        return lhs.MyText == rhs.MyText
    }

    var body: some View {
        let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

        return HStack {
            Spacer()
            VStack{
                Button(action:{
                    self.MyText = "\(self.ble.getValue()!) mV"
                    print("Text is \(self.MyText as NSString)")
                }, label: {
                    Text(MyText)
                        .font(.system(size: 40))
                        .bold()
                        .foregroundColor(Color.black)
                        .padding(.trailing, 15)
                        .frame(height: 100)
                })
                Button(action: {
                    self.MyText = "\(self.ble.getValue()!) mV"
                    print("Text is \(self.MyText as NSString)")

                }, label: {
                    Text(MyText)
                        .font(.system(size: 25))
                        .padding(.top, -20)
                        .padding(.bottom, 20)
                        .foregroundColor(Color.black)
                })
            }
        }.onReceive(timer)
        { _ in // TIMER FUNCTIONALITY HERE
            self.MyText = "\(self.ble.getValue()!) mV"
            print("Text is \(self.MyText)")
        }
    }
}


struct MeasurementReading_Previews: PreviewProvider {
    static var previews: some View {
        MeasurementReading(ble: BluetoothConnectionmanager())
    }
}

每隔 1 秒,将从 BLE 系统读取的正确值分配给 MyText,然后 MyText 将使用更新的值正确打印到调试输出。

这里的问题是视图 MeasurementReading 不会更新。 此外,在任何项目上使用闭包也具有相同的行为(变量被更新,它被正确输出但没有视图更新)例如 .onTap{....} 将具有相同的行为或任何其他 .onXXXX 闭包。 我可以使用 MyText 状态的新值更新视图的唯一方法是将行为放在一个按钮中。

我的问题是:为什么即使状态变量通过 Timer 或 .onXXXX 闭包更改,视图也不会更新?

您需要将ble值设置为更新的计时器值:

如果没有正确测试。 我还认为您的BluetoothConnectionmanager需要是一个@State属性才能工作。

@State var ble: BluetoothConnectionmanager

.onReceive(timer) { value in // value is the updated value
    self.ble.value = value
    self.MyText = "\(self.ble.getValue()!) mV"
    print("Text is \(self.MyText)")
}

查看示例以了解计时器如何与Date()对象一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM