[英]Pass data from model to view in SwiftUI
從 CameraView 中的按鈕填充 videoClips 數組后,如何從 CameraService 獲取數據。
我希望能夠按下一個按鈕並移動到一個新的屏幕,沿着 AVPlayerItems 數組傳遞。
即使我知道 CameraService 的數組中有數據,我的按鈕也總是打印 0
public class CameraService: NSObject, AVCaptureFileOutputRecordingDelegate {
@Published public var videoClips = [AVPlayerItem]()
public func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
let video: AVPlayerItem = AVPlayerItem(url:outputFileURL)
videoClips.append(video)
}
}
final class CameraModel: ObservableObject {
private let service = CameraService()
var videoClips: [AVPlayerItem]
init() {
videoClips = service.videoClips
}
}
struct CameraView: View {
@StateObject var model = CameraModel()
var body: some View {
Button("video") {
print(model.videoClips.count)
}
}
}
在當前的形式中, model.videoClips.count
將永遠為 0,因為您在init()
中設置videoClips
,然后它就再也不會更新了。
我猜你假設它會被更新,因為CameraService.videoClips
是一個@Published
屬性。 但是, @Published
只會被View
和它們的ObservableObject
自動監視。 所以,這里有兩個問題:a) CameraService
不是ObservableObject
並且CameraModel
不是View
。
我的第一個建議是完全CameraModel
。 也許它是一個 function 試圖做一個最小的例子,但在目前的形式下,它什么也沒做——它只是一個沒有功能的中間人。 因此,將CameraService
轉換為ObservableObject
,這意味着@Published
屬性可以正常工作,您就可以開始使用了。
關於導航到另一個屏幕,這可能是一個單獨的問題的最佳選擇,但我會在這里留下一個簡短的答案:
//in your view
NavigationLink(destination: DetailView(videoClips: service.videoClips)) {
Text("Link")
}
(這是假設您已將CameraService
轉換為ObservableObject
)
如果由於某種原因您確實需要CameraModel
和CameraService
,則可以通過執行以下操作來連接兩者:
class CameraModel : ObservableObject {
private let service = CameraService()
@Published var videoClips : [AVPlayerItem] = [] //note that this is @Published now
init() {
service.$videoClips.assign(to: &self.$videoClips) //use a Combine Publisher to get updates from the CameraService videoClips and assign them to this class's videoClips any time there's an update
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.