UITabBar, содержащий представление SwiftUI

У меня есть приведенная ниже серия контроллеров и представлений. Однако, когда я использую ссылку навигации в MoreView, она меняет значение tabBarItem.title. Например, будет сказано больше, но когда нажата кнопка политики конфиденциальности и пользователь переходит к представлению политики, заголовок на панели вкладок изменяется на то, что находится в.navigationBarTitle(), или, если не указан, на пустую строку! Как мне этого избежать? Я хочу, чтобы заголовок панели вкладок был статическим

UITabBar -> UINavigationController -> MoreViewController(UIHostingController) -> MoreView(SwiftUI)

ПодробнееПросмотреть

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)

4 ответа

Это должно быть ошибкой в ​​iOS. Отправьте отчет об ошибке в Apple.

Я только что обнаружил способ решения этой проблемы:

Создайте собственный подкласс UINavigationController и используйте его как контроллер навигации, содержащий ваш MoreViewController.

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

Похоже, что обходной путь @funkenstrahlen направлен на решение обратной проблемы и в моем случае привел к исключению из-за плохого доступа. Для случая, когда tabBarItemзаголовок исчезает, это обходной путь, который сработал для меня:

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

Вы можете установить storedTabBarItemв initили сделайте его общедоступным и установите его напрямую.

Я использовал следующий код (очень похожий на версию @taeyawn), который решил проблему с исчезающим заголовком панели вкладок для меня и не нуждался в настройкеstoredTabBarItemвinit:

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

При запуске приложения установить 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 }
  }
}
Другие вопросы по тегам