包含SwiftUI视图的UITab栏

u2nhd7ah  于 2023-02-15  发布在  Swift
关注(0)|答案(4)|浏览(147)

我有下面一系列的控制器和视图。然而,当我使用MoreView上的导航链接时,它会更改tabBarItem.title值。例如,它会显示更多内容,但当单击隐私策略按钮并将用户导航到策略视图时,选项卡栏中的标题会更改为navigationBarTitle中的任何内容。()或者如果未提供,则为空字符串!如何避免这种情况?我希望选项卡栏标题是静态的
UI工具栏-〉UI导航控制器-〉更多视图控制器(UI主机控制器)-〉更多视图(快速UI)
更多视图

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)
mrzz3bfm

mrzz3bfm1#

这将是iOS中的一个bug。请向苹果提交bug报告。
我刚刚发现了a workaround for this issue
创建UINavigationController的自定义子类,并将其用作包含MoreViewController的导航控制器。

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

hjzp0vay2#

看起来@funkenstrahlen的解决方案旨在解决这个问题的逆问题,并且在我的例子中导致了一个坏的访问异常。对于tabBarItem的标题消失的例子,这是一个对我有效的解决方案:

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

您可以在init中设置storedTabBarItem,也可以将其设置为公共并直接设置。

gzjq41n4

gzjq41n43#

在应用程序启动时,将YourTabBarController设置为单例。
TabBarHelper.instance.tabBar = YourTabBarController()
然后在您的SwifUIView .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 }
  }
}
s5a0g9ez

s5a0g9ez4#

我使用了下面的代码(非常类似@taeyawn的版本),为我修复了标签栏标题消失的问题,并且不需要在init中设置storedTabBarItem

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

相关问题