我的 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 后,问题仍然存在。 有没有人遇到过类似的问题或可以提出解决方案?任何帮助将不胜感激!
非常感谢您的帮助!我将 NavigationView 更改为 NavigationStack,现在菜单栏按预期工作!