SwiftUI:打开外部链接并返回应用程序后导航栏重复

问题描述 投票:0回答:1

我的 SwiftUI 应用程序遇到问题,打开外部链接并返回应用程序后,导航栏会重复。这种情况在物理 iPhone 11 设备和模拟器中都会发生。 这是我的 DetailView 的简化版本:

迅速 结构 DetailView: 查看 { 让项目:RSSItem

var body: some View {
    ScrollView {
        VStack(alignment: .leading) {
            Button(action: {
                openURL(item.url)
            }) {
                Text(item.title)
                    .font(.title)
                    .padding(.bottom)
            }
            
            Text(item.text)
                .font(.body)
            
            // More content...
        }
        .padding()
    }
    .navigationBarTitle(item.title, displayMode: .inline)
}

func openURL(_ urlString: String) {
    guard let url = URL(string: urlString) else {
        print("Invalid URL: \(urlString)")
        return
    }
    
    UIApplication.shared.open(url)
}

}

以下是我在父视图 (FirestoreDataView) 中设置导航栏的方法: 迅速 结构FirestoreDataView:查看{ // ...其他状态变量和属性

var body: some View {
    NavigationView {
        List {
            // ... list content
        }
        .listStyle(PlainListStyle())
        .navigationBarItems(leading: leadingBarItems, trailing: trailingBarItems)
        .navigationBarTitleDisplayMode(.inline)
    }
    .background(Color.white.edgesIgnoringSafeArea(.all))
    .onAppear {
        fetchData()
        customizeNavigationBar()
    }
}

@ViewBuilder
private var leadingBarItems: some View {
    HStack {
        Button("All Read") {
            markAllAsRead()
        }
        
        Button(showUnreadOnly ? "Unread" : "All") {
            showUnreadOnly.toggle()
        }
    }
}

@ViewBuilder
private var trailingBarItems: some View {
    HStack {
        Toggle("KI Only", isOn: $showKIOnly)
            .toggleStyle(CheckboxToggleStyle())
        
        Toggle("Gut", isOn: $showGutOnly)
            .toggleStyle(CheckboxToggleStyle())
        
        Picker("Category", selection: $selectedCategory) {
            Text("All").tag("")
            ForEach(categories, id: \.self) { category in
                Text(category).tag(category)
            }
        }
    }
}

func customizeNavigationBar() {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithTransparentBackground()
    appearance.backgroundColor = .clear
    appearance.titleTextAttributes = [.font: UIFont.systemFont(ofSize: 16)]
    let desiredHeight: CGFloat = 44.0 / 3.0 // Adjust the height as needed
    UINavigationBar.appearance().standardAppearance = appearance
    UINavigationBar.appearance().compactAppearance = appearance
    UINavigationBar.appearance().scrollEdgeAppearance = appearance
    UINavigationBar.appearance().frame.size.height = desiredHeight
}

}

当我点击 DetailView 中的标题按钮(在默认浏览器中打开 URL)时,会出现此问题。当我返回应用程序时,导航栏会重复,所有按钮都会显示两次。

我已尝试以下解决方案,但问题仍然存在: 从 VStack 中删除了 navigationBarTitle 修饰符,并将其应用到 ScrollView 上。 用 NavigationView 包装 ScrollView 并对其应用 navigationBarTitle 修饰符。 使用 ZStack 而不是 ScrollView 并将 navigationBarTitle 修饰符应用于 ZStack。 实现了自定义 SafariViewController 以打开应用程序内的链接。 将 .navigationViewStyle(StackNavigationViewStyle()) 添加到父视图中的主 NavigationView 中。 尝试使用 WKWebView 而不是 UIApplication.shared.open(url) 打开应用程序内的链接。 删除了customizeNavigationBar()函数以查看自定义外观是否导致了问题。 这些解决方案都没有解决该问题。打开外部链接后返回应用程序时,导航栏仍然重复。

附加信息: 该应用使用 Firebase Firestore 进行数据存储和检索。 该问题在不同的 iOS 版本(14、15 和 16)中一致出现。 即使清理构建文件夹并重新启动 Xcode 后,问题仍然存在。 有没有人遇到过类似的问题或可以提出解决方案?任何帮助将不胜感激!

ios swift firebase swiftui
1个回答
0
投票

非常感谢您的帮助!我将 NavigationView 更改为 NavigationStack,现在菜单栏按预期工作!

© www.soinside.com 2019 - 2024. All rights reserved.