如何在SwiftUI中传递进度值(也许结合使用?)>

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

我刚刚开始学习SwiftUI,但没有时间进行合并。我对此不太了解。如何在ProgressView中将值传递给下载进度。在下载过程中如何配置ODRManager以及如何传输值,不是0并立即为1,而是0.0 ... 0.1.0.2 ... 0.8,0.9,1.0我想知道仅SwiftUI,以及使用Combine或其他方法的不同方法和方法。

非常感谢。

SwiftUI代码

import SwiftUI

struct ProgressView: View {

    @Binding var value: Float

    var body: some View {
        GeometryReader { geometry in
            ZStack(alignment: .leading) {
                Rectangle()
                    .frame(width: geometry.size.width, height: geometry.size.height)
                    .opacity(0.3)
                    .foregroundColor(.gray)

                Rectangle()
                    .frame(width: min(CGFloat(self.value) * geometry.size.width, geometry.size.width), height: geometry.size.height)
                    .foregroundColor(.blue)
                    .animation(.linear)
            }.cornerRadius(45.0)
        }
    }
}

struct ContentView: View {

    @State var progressValue: Float = 0.0

    var body: some View {
        VStack {
            Button(action: { //here is the function to download from ondemand }) {
                Text("Download")
                    .padding(.init(top: 10, leading: 30, bottom: 10, trailing: 30))
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(14)

            }
            .padding(.bottom, 30)

            ProgressView(value: $progressValue)
                .environmentObject(self.manager)
                .frame(width: 250, height: 20)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()

    }
}

按需管理者代码

class ODRManager: NSObject {
    var resourceRequest : NSBundleResourceRequest?
    var progress:Float = 0.0 

    func fetchODRResourceWithName(fileName: String) {
        guard self.resourceRequest == nil else {return}
        self.resourceRequest = NSBundleResourceRequest(tags: [fileName])
        progress = Float((resourceRequest?.progress.fractionCompleted)!)
        self.resourceRequest!.progress.addObserver(self, forKeyPath: "fractionCompleted", options: .new, context: nil)
        self.resourceRequest?.conditionallyBeginAccessingResources(completionHandler: { (resourceAvailable) in
            if !resourceAvailable {
                self.resourceRequest!.beginAccessingResources { err in
                    guard err == nil else {
                        print(err as Any)
                        return
                    }
                  print("downloading..")
                }
            } else { 
               print("was downloaded")
            }
        })
    }

    func stopDownloadingFile() {
        guard self.resourceRequest != nil else {
            return
        }
        self.resourceRequest!.endAccessingResources()
        self.resourceRequest!.progress.removeObserver(self, forKeyPath: "fractionCompleted")
        self.resourceRequest!.progress.cancel()
        self.resourceRequest = nil
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "fractionCompleted" {
            DispatchQueue.main.async { [weak self] in
                self.progress = Float((self?.resourceRequest!.progress.fractionCompleted)!)
            }
        }
    }
}

我刚刚开始学习SwiftUI,但没有时间进行合并。我对此不太了解。如何在ProgressView中将值传递给下载进度。如何配置ODRManager ...

swiftui key-value-observing combine
2个回答
0
投票
class ODRManager: ObservableObject {
    var resourceRequest : NSBundleResourceRequest?
    @Published var progress:Float = 0.0 

    ... rest of code as before ...
}

0
投票

目前尚不清楚ODRManagerContentView之间的关系,但是我建议在它们之间引入一些中间模型(以避免紧密耦合,例如

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