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 }
}