我将如何将数组内容分配给变量以在视图中使用。
struct SwiftCameraApp: App {
@StateObject var service = CameraService()
var body: some Scene {
WindowGroup {
Home()
.environmentObject(service)
}
}
public class CameraService: NSObject, ObservableObject {
@Published var videoClips = [URL]()
public func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print("finished recording the video to: (outputFileURL)")
print(output.recordedDuration)
videoClips.append(outputFileURL)
//returns 1 at this point
print("(videoClips.count) video clip is now in the camera service")
}
struct ViewA: View {
@StateObject var model = CameraService()
Button("Adds item to videoClips") {
model.fileOutput()
}
}
struct ViewB: View {
@EnvironmentObject var service : CameraService
var body: some View {
Button("Prints Array count") {
print(service.$videoClips.count())
}
}
}
输出:
Count(上游: Combine.Published
也许有帮助。
a) 当相机服务启动时,视频剪辑为空。在视图 A 中按下按钮后添加一个值。
b) 我认为当视图初始化时,会创建一个新的相机服务,使其成为一个空数组
c) 这个想法是拍摄视频。将其附加到 videoClips 数组,然后对视图 B 中的内容执行某些操作。
也许你只是想要(即数组中的元素数量):
Button("Prints Array count") {
print(service.videoClips.count)
}
更新:它在ViewA
中使用了不同的CameraService
对象,所以更新ViewA
ViewB
没有任何变化,因为模型的实例不一样。
相反,您需要使用对相同CameraService
的引用,即环境对象中提供的
struct ViewA: View {
@EnvironmentObject var model: CameraService // << here !!
Button("Adds item to videoClips") {
model.fileOutput()
}
}
>@StateObject var model = CameraService()
中的每一个都是服务的单独实例。SwiftCameraApp
的人看不到ViewA
在做什么,反之亦然。
如果您希望他们使用来自SwiftCameraApp
>Home
>ViewA
EnvironmentObject
进行通信,或者您可以将服务更改为单例。
public class CameraService: NSObject, ObservableObject {
static let shared = CameraService()
@Published var videoClips = [URL]()
private init(){}
public func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print("finished recording the video to: (outputFileURL)")
print(output.recordedDuration)
videoClips.append(outputFileURL)
//returns 1 at this point
print("(videoClips.count) video clip is now in the camera service")
}
并将您的StateObject
更改为@StateObject var model = CameraService.shared