将数据从模型传递到 SwiftUI 中的视图
Posted
技术标签:
【中文标题】将数据从模型传递到 SwiftUI 中的视图【英文标题】:Pass data from model to view in SwiftUI 【发布时间】:2021-02-17 06:27:41 【问题描述】:从 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)
【问题讨论】:
【参考方案1】:在其当前形式中,model.videoClips.count
永远只会是 0,因为您在 init()
中设置了 videoClips
,然后它就再也不会更新了。
我猜你假设它会更新,因为CameraService.videoClips
是@Published
属性。但是,@Published
只会被View
s 和他们的ObservableObject
s 自动观看。所以,这里有两个问题: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
【讨论】:
已修复。现在收到此错误。Count<Publisher>(upstream: Combine.Published<Swift.Array<Foundation. AVPlayerItem >>.Publisher(subject: Combine.PublishedSubject<Swift.Array<Foundation. AVPlayerItem >>))
我没有看到错误——这是部分引用吗?也许用完整的错误更新您的问题以及它发生在哪一行?以上是关于将数据从模型传递到 SwiftUI 中的视图的主要内容,如果未能解决你的问题,请参考以下文章
如何将字符串数组从视图模型传递到 swiftUI 中播放歌曲
SwiftUI:如何将 NSManagedObjectContext 传递到多个视图模型中
如何将数据从子视图传递到父视图到 SwiftUI 中的另一个子视图?
将变量从 UIHostingController 传递到 SWIFTUI 视图