私は、2番目の画面としてVNDocumentCameraViewController
aに埋め込まれUIViewControllerRepresentable
たビューにa を持っています。(スキャンのキャンセル時または保存時に) を閉じると、タブ ビューが最初の画面に戻ります。その部分は魅力のように機能します。ScanView
TabView
VNDocumentCameraViewController
私の問題は、に戻ったときに、VNDocumentCameraViewController
そのコントローラーを再インスタンス化して最初からやり直したいということです。これは、それを達成する方法がわかりません。
ContentView
への参照を保持していることが原因でScanView
、が再インスタンス化されないことは承知してUIViewControllerRepresentable
います。どうすれば手動で再インスタンス化できますか?
コードは次のとおりです。
import SwiftUI
@main
struct so_VisionKitInTabsApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@State private var tabSelection = 1
var body: some View {
TabView(selection: $tabSelection) {
Text("First View")
.tabItem { Text("First View") }
.tag(1)
ScanView(tabSelection: $tabSelection)
.tabItem { Text("Scan View") }
.tag(2)
}
}
}
import VisionKit
struct DocumentScanningViewAdapter: UIViewControllerRepresentable {
typealias UIViewControllerType = VNDocumentCameraViewController
let onDismiss: () -> ()
func makeCoordinator() -> Coordinator {
Coordinator(parent: self)
}
func makeUIViewController(context: Context) -> VNDocumentCameraViewController {
let vc = VNDocumentCameraViewController()
vc.delegate = context.coordinator
return vc
}
func updateUIViewController(_ uiViewController: VNDocumentCameraViewController, context: Context) { }
class Coordinator: NSObject, VNDocumentCameraViewControllerDelegate {
var parent: DocumentScanningViewAdapter
init(parent: DocumentScanningViewAdapter) {
self.parent = parent
}
func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
print("Finished successfully…")
parent.onDismiss()
}
func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) {
print("Cancelled…")
resetCoordinator(for: controller)
parent.onDismiss()
}
func resetCoordinator(for controller: VNDocumentCameraViewController) {
controller.delegate = parent.makeCoordinator()
}
}
}
struct ScanView: View {
@Binding var tabSelection: Int
var body: some View {
DocumentScanningViewAdapter(onDismiss: { tabSelection = 1 })
}
}