簡體   English   中英

帶有 UIViewControllerRepresentable 的 SwiftUI

[英]SwiftUI with UIViewControllerRepresentable

我正在嘗試在 swiftUi 項目中使用可表示的 UIViewController。 具體來說,我試圖按下一個按鈕 (assetOne),允許歐盟選擇一個視頻,然后按下另一個按鈕 (assetTwo),它允許用戶選擇另一個視頻。 然后用戶可以選擇合並視頻(使用第三個按鈕)。 我認為我需要使用 Coordinator 來完成此任務,但在看到沒有它SO 解決方案后,我嘗試在沒有它的情況下完成。 但是當我運行我的項目時,構建成功了,但是當我單擊內容視圖中的任何按鈕時,我收到以下錯誤消息。 我究竟做錯了什么? 我是否需要協調器以及如何將其與我當前的配置相結合?

警告:嘗試在視圖不在窗口層次結構中的 <TempTest.MergeVideoViewController: 0x7fa05ed088c0> 上呈現 <UIImagePickerController: 0x7fa05f827600>!

內容視圖:

import SwiftUI

struct ContentView: View {
    
    let someView = ImagePicker()
    
    var body: some View {
        VStack {
            Button(action: {
                print("SwiftUI: assetOne button tapped")
                // Call func in SomeView()
                self.someView.assetOne()
            }) {
                Text("Asset One").foregroundColor(Color.black)
            }
            .background(Color.blue)
            .padding(10)
            .clipShape(Capsule())
}
//...

ImagePicker: UIViewControllerRepresentable

struct ImagePicker: UIViewControllerRepresentable{
    
    let someView = MergeVideoViewController()

func makeUIViewController(context: Context) -> MergeVideoViewController {
      someView
    }

    func updateUIViewController(_ uiViewController: MergeVideoViewController, context: Context) {}
    
    func assetOne() {
        someView.loadAssetOne()
    }
    //...
}

我的 UIViewController 類:

class MergeVideoViewController: UIViewController {
    var firstAsset: AVAsset?
    var secondAsset: AVAsset?
    var audioAsset: AVAsset?
    var loadingAssetOne = false
    var activityMonitor: UIActivityIndicatorView!
    
func exportDidFinish(_ session: AVAssetExportSession) {
    // Cleanup assets
    activityMonitor.stopAnimating()
    firstAsset = nil
    secondAsset = nil
    audioAsset = nil

//...

func loadAssetOne() {
        //  func loadAssetOne(_ sender: AnyObject) {
        if savedPhotosAvailable() {
            loadingAssetOne = true
            VideoHelper.startMediaBrowser(delegate: self, sourceType: .savedPhotosAlbum)
        }
    }

//...

ImagePicker是一個視圖,它應該在body某個地方。

這是可能的方法 - 想法是在 SwiftUI 中獲取控制器引用,並在需要時直接調用其操作。

struct ImagePicker: UIViewControllerRepresentable{
    let configure: (MergeVideoViewController) -> ()

    func makeUIViewController(context: Context) -> MergeVideoViewController {
       let someView = MergeVideoViewController()
       configure(someView)
       return someView
    }

    func updateUIViewController(_ uiViewController: MergeVideoViewController, context: Context) {}
}

struct ContentView: View {

    @State private var controller: MergeVideoViewController?

    var body: some View {
        VStack {
            ImagePicker {
                self.controller = $0
            }

            Button(action: {
                print("SwiftUI: assetOne button tapped")
                self.controller?.loadAssetOne()
            }) {
                Text("Asset One").foregroundColor(Color.black)
            }
            .background(Color.blue)
            .padding(10)
            .clipShape(Capsule())
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM