ios - 将数据从模型传递到 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,因为你设置videoClips
了init()
它,然后它就再也不会更新了。
我猜你假设它会被更新,因为它CameraService.videoClips
是一个@Published
属性。但是,@Published
只会被View
s 和他们ObservableObject
的 s 自动观看。所以,这里有两个问题:a)CameraService
不是aObservableObject
也不CameraModel
是 a View
。
我的第一个建议是CameraModel
彻底放弃。也许这是一个尝试做一个最小示例的功能,但在当前的形式下,它什么也没做——它只是一个没有功能的中间人。所以,CameraService
变成一个ObservableObject
,这意味着该@Published
属性可以工作,你会很高兴。
关于导航到另一个屏幕,这可能是一个单独的问题的最佳选择,但我会在这里留下一个简短的答案:
//in your view
NavigationLink(destination: DetailView(videoClips: service.videoClips)) {
Text("Link")
}
(这是假设你已经变成CameraService
了你的ObservableObject
)
如果由于某种原因您确实需要CameraModel
and 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
}
}
推荐阅读
- javascript - 如何在 React 上切换 css 类
- angular - 如何在 Angular 5 中使用 Bootstrap 侧导航栏和路由?
- mysql - “未签名”:语法错误:导入到 sqlite 时创建表查询
- android - Glide clear() 方法无法解决
- c# - Android - 在 foreach 循环 C# 中使用 await
- node.js - 如何等到mongodb获取值然后通过函数返回
- python - 如何计算列表中的唯一字符串
- javascript - 将 VueJS 组件渲染到 Google Map Infowindow 中
- c# - 在 asp.net core 中将分页添加到剃刀视图
- javascript - 如何使用 AWS Lambda 通过 Telegram Bots 发送文件?