SafariView 只加载一个 url,似乎无法加载另一个
SafariView only loads a single url, can't seem to load another
我想在应用程序内部的 Safari 浏览器中加载特定网页(即不在应用程序之外),并且它应该存在于相同的 safari 环境中,即没有常规的网络视图。
我有这个 SafariView
可以在 SwiftUI 中启用它。
现在我想从同一个场景加载不同的 urls(数量不同,可以是 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>
) {}
}
我在另一个场景中所做的是创建 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: [=10=]) {
SafariView(url: url)
}
}
}
}
请注意,您需要在 item
中传递一些 Identifiable
变量。一种可能的解决方案是使 String 符合 Identifiable
:
extension String: Identifiable {
public var id: Self { self }
}
我想在应用程序内部的 Safari 浏览器中加载特定网页(即不在应用程序之外),并且它应该存在于相同的 safari 环境中,即没有常规的网络视图。
我有这个 SafariView
可以在 SwiftUI 中启用它。
现在我想从同一个场景加载不同的 urls(数量不同,可以是 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>
) {}
}
我在另一个场景中所做的是创建 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: [=10=]) {
SafariView(url: url)
}
}
}
}
请注意,您需要在 item
中传递一些 Identifiable
变量。一种可能的解决方案是使 String 符合 Identifiable
:
extension String: Identifiable {
public var id: Self { self }
}