【问题标题】:Pass data from model to view in SwiftUI将数据从模型传递到 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)
    }
  }
}

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    在其当前形式中,model.videoClips.count 永远只会是 0,因为您在 init() 中设置了 videoClips,然后它就再也不会更新了。

    我猜你假设它会更新,因为CameraService.videoClips@Published 属性。但是,@Published 只会被Views 和他们的ObservableObjects 自动观看。所以,这里有两个问题:a) CameraService 不是 ObservableObjectCameraModel 不是 View

    我的第一个建议是完全放弃CameraModel。也许这是一个尝试做一个最小例子的功能,但在目前的形式下,它什么也没做——它只是一个没有功能的中间人。因此,将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 
        }
    }
    

    【讨论】:

    • 已修复。现在收到此错误。 Count<Publisher>(upstream: Combine.Published<Swift.Array<Foundation. AVPlayerItem >>.Publisher(subject: Combine.PublishedSubject<Swift.Array<Foundation. AVPlayerItem >>))
    • 我没有看到错误——这是部分引用吗?也许用完整的错误更新您的问题以及它发生在哪一行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多