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 }
}
}