SFSafariViewController
является компонентом UIKit
, поэтому вам нужно сделать его UIViewControllerRepresentable
.
См. Интеграция SwiftUI WWDC 19 видео для получения дополнительной информации о том, как соединить UIKit
компоненты с SwiftUI
.
struct SafariView: UIViewControllerRepresentable {
let url: URL
func makeUIViewController(context: UIViewControllerRepresentableContext<SafariView>) -> SFSafariViewController {
return SFSafariViewController(url: url)
}
func updateUIViewController(_ uiViewController: SFSafariViewController,
context: UIViewControllerRepresentableContext<SafariView>) {
}
}
Замечание: SFSafariViewController
предназначено для представления поверх другого контроллера представления, а не для перемещения в стек навигации.
Он также имеет панель навигации, что означает, что если вы нажмете на контроллер представления, вы увидите две панели навигации.
Кажется, что это работает - хотя это и глючно - если представлено модально.
struct ContentView : View {
let url = URL(string: "https://www.google.com")!
var body: some View {
EmptyView()
.presentation(Modal(SafariView(url:url)))
}
}
Это выглядит так:
Я предлагаю портировать WKWebView
на SwiftUI
по протоколу UIViewRepresentable
и использовать его вместо него.