中的一个按钮填充videoClips数组之后从CameraService获取数据
我希望能够按下一个按钮并移动到一个新的屏幕上,通过一个AVPlayerItems.数组传递。
即使我知道CameraService中的数组中有数据,
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)
}
}
}
发布于 2021-02-16 23:19:47
在其当前形式中,model.videoClips.count
将永远只为0,因为您在init()
中设置了videoClips
,然后就再也不会更新它了。
我猜您假设它将被更新,因为CameraService.videoClips
是一个@Published
属性。但是,@Published
只能由View
和它们的ObservableObject
自动监视。因此,这里有两个问题:( a) CameraService
不是ObservableObject
,CameraModel
不是View
。
我的第一个建议是完全抛弃CameraModel
。也许这是一个尽量少的例子的函数,但在它目前的形式中,它没有做任何事情--它只是一个没有功能的中间人。因此,将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
}
}
https://stackoverflow.com/questions/66236747
复制