Swift ProgressBar iOS 13

Swift ProgressBar iOS 13,swift,swiftui,progress-bar,combine,Swift,Swiftui,Progress Bar,Combine,我已经尝试创建自己的ProgressView来支持iOS 13,但由于某些原因,它似乎不起作用。我尝试了@State、@Binding和普通的var-progress:progress,但它根本没有更新 struct ProgressBar:视图{ @绑定var进度:进度 var body:一些观点{ VStack(对齐:。前导){ 文本(“\(Int(progress.fractionCompleted))%completed”) ZStack{ 圆角转角(拐角半径:2) .foregroun

我已经尝试创建自己的
ProgressView
来支持iOS 13,但由于某些原因,它似乎不起作用。我尝试了
@State
@Binding
和普通的
var-progress:progress
,但它根本没有更新

struct ProgressBar:视图{
@绑定var进度:进度
var body:一些观点{
VStack(对齐:。前导){
文本(“\(Int(progress.fractionCompleted))%completed”)
ZStack{
圆角转角(拐角半径:2)
.foregroundColor(颜色(UIColor.systemGray5))
.框架(高度:4)
GeometryReader{中的度量
圆角转角(拐角半径:2)
.foregroundColor(.blue)
.frame(宽度:metrics.size.width*CGFloat(progress.fractionCompleted))
}
}.框架(高度:4)
文本(\(progress.totalUnitCount)中的\(progress.completedUnitCount)
.font(.footnote)
.foregroundColor(.灰色)
}
}
}
在我的内容视图中,我添加了iOS 14变体和支持iOS 13的变体。它们看起来是一样的,但iOS 13变体没有任何改变

struct ContentView:View{
@状态私有变量进度=进度(totalUnitCount:10)
让timer=timer.publish(每隔:1,在:.main上,在:.common中)。自动连接()
var body:一些观点{
VStack{
ProgressBar(进度:$progress)
.padding()
.onReceive(timer){timer in
progress.completedUnitCount+=1
如果progress.isfinish{
self.timer.upstream.connect().cancel()
progress.totalUnitCount=500
}
}
如果可用(iOS 14,*){
ProgressView(进度)
.padding()
.onReceive(timer){timer in
progress.completedUnitCount+=1
如果progress.isfinish{
self.timer.upstream.connect().cancel()
progress.totalUnitCount=500
}
}
}
}
}
}

iOS 14变体可以工作,但我的iOS 13实现失败。有人能帮我吗?

Progress是一个NSObject,它不是一个结构,所以状态对它不起作用。您必须使用KVO来观察正在进行的更改,并重定向到SwiftUI视图的真实来源

下面是可能的解决方案的简化演示。使用Xcode 12.1/iOS 14.1进行测试

并更新了调用位置以使用相同的构造函数

struct ContentView: View {
    @State private var progress = Progress(totalUnitCount: 10)
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    var body: some View {
        VStack {
            ProgressBar(progress)      // << here !!

// ... other code
struct ContentView:View{
@状态私有变量进度=进度(totalUnitCount:10)
让timer=timer.publish(每隔:1,在:.main上,在:.common中)。自动连接()
var body:一些观点{
VStack{
进度条(进度)//
struct ContentView: View {
    @State private var progress = Progress(totalUnitCount: 10)
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    var body: some View {
        VStack {
            ProgressBar(progress)      // << here !!

// ... other code