如何解决SafariView仅加载一个网址,似乎无法加载另一个网址
我想在应用程序内的Safari浏览器中加载特定的网页(即不在应用程序外部),并且它应该存在于相同的safari环境中,即没有常规的网页视图。
我有这个SafariView
可以在SwiftUI中启用它。
现在,我想从同一场景加载不同的网址(数字可能有所不同,可以为0到20位数)。
当我打开SafariViews时,虽然只打开了第一个URL。当我单击第二个按钮时,第一个网址再次加载。
import SwiftUI
import SafariServices
struct ContentView: View {
@State private var showSafari = false
var body: some View {
vstack {
Button(action: {
showSafari = true
}) {
Text("Apple")
.padding()
}
.fullScreenCover(isPresented: $showSafari) {
SafariView(url: URL(string: "http://www.apple.com")!)
}
Button(action: {
showSafari = true
}) {
Text("Google")
.padding()
}
.fullScreenCover(isPresented: $showSafari) {
SafariView(url: URL(string: "http://www.google.com")!)
}
}
}
}
struct SafariView: UIViewControllerRepresentable {
var url: URL
func makeUIViewController(
context: UIViewControllerRepresentableContext<SafariView>
) -> SFSafariViewController {
return SFSafariViewController(url: url)
}
func updateUIViewController(
_ uiViewController: SFSafariViewController,context: UIViewControllerRepresentableContext<SafariView>
) {}
}
在另一个场景中,我正在创建2个单独的showSafari
变量,它似乎可以正常工作,但是在那种情况下,只显示2个硬编码的URL。
在这种safari实施中是否缺少某些内容,还是可能需要通过创建showSafari
布尔数组来解决此问题?
解决方法
尝试使用.fullScreenCover(item:content:)
:
struct ContentView: View {
@State private var safariURL: String?
var body: some View {
VStack {
Button(action: {
safariURL = "http://www.apple.com"
}) {
Text("Apple")
.padding()
}
Button(action: {
safariURL = "http://www.google.com"
}) {
Text("Google")
.padding()
}
}
.fullScreenCover(item: $safariURL) {
if let url = URL(string: $0) {
SafariView(url: url)
}
}
}
}
请注意,您需要在Identifiable
中传递一些item
变量。一种可能的解决方案是使String符合Identifiable
:
extension String: Identifiable {
public var id: Self { self }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。