包含SwiftUI视图的UITabBar

6
我有以下一系列的控制器和视图。然而,当我在MoreView上使用导航链接时,它会改变tabBarItem.title的值。例如,它会显示"更多",但是当隐私政策按钮被点击并且用户被导航到policy view时,标签栏中的标题就会更改为.navigationBarTitle()中的任何内容,或者如果没有提供,则为空字符串!如何避免这种情况?我希望标签栏标题保持不变。
UITabBar -> UINavigationController -> MoreViewController(UIHostingController) -> MoreView(SwiftUI)
MoreView
List {
            
            Section(
                header: Text("ABOUT"),
                footer: Text(aboutFooter)
                        .font(.caption)
                ) {
                    NavigationLink(destination: WebView(
                        request: URLRequest(url: URL(string: "https://www.websitepolicies.com/policies/view/ng0sNvAJ")!)
                        )//.navigationBarTitle(Text("Privacy Policy"))
                    ) {
                        Text("Privacy Policy")
                    }
                    Text("Attribution")
            }
        }
        .listStyle(GroupedListStyle())
        .environment(\.horizontalSizeClass, .regular)

我有完全相同的问题! - funkenstrahlen
@funkenstrahlen 我在 Xcode 12 beta 2 中没有遇到这个问题,最晚应该在秋季修复。 - Austin E
@AustinE 它在最终版本中又回来了 :( - Andrew
4个回答

6

这似乎是iOS中的一个错误,请向Apple提交错误报告。

我刚刚发现这个问题的解决方法

创建一个UINavigationController的自定义子类,并将其用作包含您的MoreViewController的导航控制器。

class WorkaroundUINavigationController: UINavigationController {
    override var title: String? {
       get { tabBarItem.title }
       set { navigationItem.title = newValue }
    }
}

3
我在自定义的MoreViewController中遇到了同样的情况。无论我做什么,这个解决方案似乎都会在getter和setter之间引起循环。 - Brandt

1

似乎@funkenstrahlen的解决方法旨在解决这个问题的反向,但在我的情况下却导致了一个坏的访问异常。对于tabBarItem的标题消失的情况,这是一个对我有效的解决方法:

class WorkaroundUINavigationController: UINavigationController {
    private var storedTabBarItem: UITabBarItem
    override var tabBarItem: UITabBarItem! {
        get { return storedTabBarItem }
        set { storedTabBarItem = newValue }
    }
}

您可以在init中设置storedTabBarItem,或者将其设为公共属性并直接设置它。


这对我有用。谢谢!在周五下午遇到这样一个恼人的bug真是够糟心的。 - TylerJames

0
在应用程序开始时,将YourTabBarController设置为单例。

TabBarHelper.instance.tabBar = YourTabBarController()

然后在您的SwiftUIView中添加以下内容:.onAppear
VStack {}
.onAppear {
   TabBarHelper.instance.removeTabBarItemsTitles()
}

其他类可能看起来像这样

class TabBarHelper {
   static let instance = TabBarHelper()
   var tabBar: YourTabBarController?

   func removeTabBarItemsTitles() {
     tabBar.removeItemsTitles()
   }
}

class YourTabBarController: UITabBarController {
  ...
  func removeItemsTitles() {
     tabBar.items.forEach { $0.title = nil }
  }
}

0
我使用了以下代码(与@taeyawn的版本非常相似),它解决了我的消失选项卡栏标题问题,并且不需要在init中设置storedTabBarItem
class WorkaroundUINavigationController: UINavigationController {
    private var storedTabBarItem: UITabBarItem?
    override var tabBarItem: UITabBarItem! {
        get { return storedTabBarItem ?? super.tabBarItem }
        set { storedTabBarItem = newValue }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接