我试图在一个UIViewController项目中使用一个可表示的swiftUi。具体来说,我正在尝试按一个按钮(assetOne),它允许欧盟选择一个视频,然后按另一个按钮(assetTwo),它允许用户选择另一个视频。然后用户可以选择合并视频(用第三个按钮)。我以为我需要使用一个协调员来完成这个任务,但是在看到了一个SO solution without it之后,我尝试不使用它。但是,当我运行我的项目时,构建是成功的,但是当我单击内容视图中的任何按钮时,我会得到下面的错误消息。我做错了什么?我需要一个协调员吗?我如何将它与我当前的配置结合起来?
警告:尝试显示 on ,其视图不在窗口层次结构中!
内容视图:
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)
}
}
//...发布于 2020-09-10 03:22:02
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())
}
}
}https://stackoverflow.com/questions/63820386
复制相似问题