簡體   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