SafariView 只加载一个网址,似乎无法加载另一个网址



我想在应用程序内部的Safari浏览器中加载特定的网页(即不在应用程序外部(,它应该存在于同一个Safari环境中,即没有常规的网络视图。

我有这个SafariView可以在SwiftUI中启用它。

现在我想从同一个场景加载不同的url(数量不同,可以是0到20 ish(。

当我打开SafariViews时,虽然只打开了第一个url。当我点击第二个按钮时,第一个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>
) {}
}

我在另一个场景中所做的是创建两个单独的showSafari变量,在那里它似乎可以工作,但在这种情况下,只显示两个硬编码的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)
}
}
}
}

请注意,您需要在item中传递一些Identifiable变量。一个可能的解决方案是使String符合Identifiable:

extension String: Identifiable {
public var id: Self { self }
}

相关内容

最新更新