Muitas vezes, somos obrigados a abrir uma visualização que deve ser apresentada em UIViewController
uma visualização SwiftUI. Exemplos proeminentes disso UIDocumentInteractionController
e menos proeminentes são o SwiftyDropbox para abrir uma tela de login do Dropbox no Safari para autenticação. A técnica comum é criar uma subclasse UIViewController
sob demanda UIViewControllerRepresentable
e apresentar o controlador de visualização a partir dela. Mas isso nunca funcionou para mim.
struct DropboxView: UIViewControllerRepresentable {
typealias UIViewControllerType = UIViewController
@Binding var isShown : Bool
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
if isShown {
let scopeRequest = ScopeRequest(scopeType: .user, scopes: ["files.content.write"], includeGrantedScopes: false)
DropboxClientsManager.authorizeFromControllerV2(
UIApplication.shared,
controller: uiViewController,
loadingStatusDelegate: nil,
openURL: { (url: URL) -> Void in UIApplication.shared.open(url, options: [:], completionHandler: nil) },
scopeRequest: scopeRequest)
}
}
func makeUIViewController(context _: Self.Context) -> UIViewController {
return UIViewController()
}
}
Quando invoco essa visualização a partir de uma visualização SwiftUI usando modificadores como:
.fullScreenCover(isPresented: $showDropboxLoginView) {
DropboxView(isShown: $showDropboxLoginView)
}
Eu recebo dois erros:
Cannot use Scene methods for URL, NSUserActivity, and other External Events without using SwiftUI Lifecycle. Without SwiftUI Lifecycle, advertising and handling External Events wastes resources, and will have unpredictable results.
e
Attempt to present <SwiftyDropbox.MobileSafariViewController: 0x107919600> on <UIViewController: 0x105a2f130> (from <UIViewController: 0x105a2f130>) whose view is not in the window hierarchy.
Gostaria de saber como apresentar esses controladores de visualização na visualização SwiftUI?
Com esta configuração você não precisa
fullScreenCover
apenas usar o arquivoUIViewControllerRepresentable
.Coloque-o em qualquer lugar do
body
.Tanto
fullScreenCover
o quantoDropboxClientsManager
parece estar usando o root.