NavigationSplitView не обновляется

Может кто-нибудь, пожалуйста, помогите мне, почемуNavigationLinkне работает как задумано? Как показано ниже (в коде), я используюMarkdownWebView(url: <url>)с 3 разными URL-адресами.

Но когда я хочу переключаться между ними, представление не обновляется. Если я открою другой вид между ними, он работает. И на айфоне(NavigationStack) тоже работает.

Проблема

Мой код:

      Section("Legal") {
    NavigationLink {
        MarkdownWebView(url: "https://<url>/privacy.md", scrollbar: false)
            .navigationTitle("Privacy Policy")
    } label: {
        Text("")
            .font(.custom(CustomFonts.FADuotone, size: 20))
            .frame(width: 30)
            .foregroundColor(.gray)
        Text(String(localized: "Privacy Policy", comment: "/"))
    }
    NavigationLink {
        MarkdownWebView(url: "https://<url>/tos.md", scrollbar: false)
            .navigationTitle("Terms of use")
    } label: {
        Text("")
            .font(.custom(CustomFonts.FADuotone, size: 20))
            .frame(width: 30)
            .foregroundColor(.gray)
        Text(String(localized: "Terms of Service", comment: "/"))
    }
    NavigationLink {
        MarkdownWebView(url: "https://<url>/licenses.md", scrollbar: false)
            .navigationTitle("Licenses")
    } label: {
        Text("")
            .font(.custom(CustomFonts.FADuotone, size: 20))
            .frame(width: 30)
            .foregroundColor(.gray)
        Text(String(localized: "Licenses", comment: "/"))
    }
}

НавигацияSplitView

Вот как выглядит NavigationSplitView:

      var body: some View {
      NavigationSplitView(columnVisibility: $navigationVM.selectedColumnVisibility) {
          column1Form
              .navigationTitle(String(localized: "Dashboard", comment: "/"))
              .navigationBarTitleDisplayMode(.large)
      } content: {
          secondForm
      }detail: {
          detailForm
      }
      .navigationSplitViewStyle(.balanced)
}
      @ViewBuilder
  var secondForm: some View {
      switch navigationVM.selectedCategory {
      case .findWineries: findWineries()
      case .profile: ProfileView()
      case .stats: StatisticsView()
      case .favWines: FavWineView()
      case .favWineries: FavWineriesView()
      case .cellar: CellarView()
      case .orders: OrderListView()
  ->  case .settings: SettingsView()
      case .none: Text("")
      }
  }
  
  @ViewBuilder
  var detailForm: some View {
      switch navigationVM.selectedDetail {
      case .map: MapView()
      case .order: Text("orderTest")
      case .orderDetail: OrderDetailView(Status: .delivered)
      case .none: Text("")
      }
}

Во втором столбце SplitView я перехожу к SettingsView() (отмечен в коде стрелкой).

Оттуда (SettingsView) я хочу нажать третью строку с помощью NavigationLink.

Это отлично работает, если я нажимаю отдельные представления. Но это не работает с одним и тем же видом и другими параметрами (как показано в посте выше).

MarkdownWebView()

      import SwiftUI
import MarkdownUI

struct MarkdownWebView: View {
    @State var url: String
    @State var scrollbar: Bool
    @State var error: Bool = false
    
    @State private var fileContent: String? = nil
    var body: some View {
        VStack {
            if let content = fileContent {
                ScrollView(showsIndicators: scrollbar) {
                    Markdown(content)
                }
            } else {
                if (error) {
                    VStack(spacing: 20) {
                        Text("")
                            .font(.custom(CustomFonts.FADuotone, size: 100, relativeTo: .body))
                            .foregroundColor(.red)
                        Text("Document not found")
                            .font(.title)
                    }
                } else {
                    VStack(spacing: 20) {
                        ProgressView()
                        Text("loading")
                    }
                }
            }
            
        }
        .onAppear {
            loadMarkdownFile(url: url)
        }
        .padding()
    }
    
    private func loadMarkdownFile(url: String) {
        DispatchQueue.global().async {
            guard let fileUrl = URL(string: url) else {
                print("File not found")
                self.error = true
                return
            }
            do {
                let content = try String(contentsOf: fileUrl)
                DispatchQueue.main.async {
                    self.fileContent = content
                }
            } catch {
                self.error = true
                print("Error reading file: \(error)")
            }
        }
    }
}

0 ответов

Другие вопросы по тегам