首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI与UIViewControllerRepresentable

SwiftUI与UIViewControllerRepresentable
EN

Stack Overflow用户
提问于 2020-09-09 22:32:24
回答 1查看 758关注 0票数 1

我试图在一个UIViewController项目中使用一个可表示的swiftUi。具体来说,我正在尝试按一个按钮(assetOne),它允许欧盟选择一个视频,然后按另一个按钮(assetTwo),它允许用户选择另一个视频。然后用户可以选择合并视频(用第三个按钮)。我以为我需要使用一个协调员来完成这个任务,但是在看到了一个SO solution without it之后,我尝试不使用它。但是,当我运行我的项目时,构建是成功的,但是当我单击内容视图中的任何按钮时,我会得到下面的错误消息。我做错了什么?我需要一个协调员吗?我如何将它与我当前的配置结合起来?

警告:尝试显示 on ,其视图不在窗口层次结构中!

内容视图:

代码语言:javascript
复制
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

代码语言:javascript
复制
struct ImagePicker: UIViewControllerRepresentable{
    
    let someView = MergeVideoViewController()

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

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

我的UIViewController类:

代码语言:javascript
复制
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)
        }
    }

//...
EN

回答 1

Stack Overflow用户

发布于 2020-09-10 03:22:02

ImagePicker是一个视图,它应该在body的某个地方。

这里有可能的方法--想法是在SwiftUI中获得控制器引用,并在需要时直接调用它的操作。

代码语言:javascript
复制
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())
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63820386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档