繁体   English   中英

从 model 传递数据以在 SwiftUI 中查看

[英]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

如果由于某种原因您确实需要CameraModelCameraService ,则可以通过执行以下操作来连接两者:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM