![](/img/trans.png)
[英]Presenting UIDocumentInteractionController with UIViewControllerRepresentable in 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.