Удалить текст с кнопки "Назад" в SwiftUI
Короче говоря, я хочу сделать это, но с SwiftUI.
(Дом должен быть удален)
До сих пор я не нашел способ получить доступ к NavigationBarButton
непосредственно, и мне удалось найти следующее, что, кажется, единственный способ найти кнопку для изменения кнопки:
struct MyList: View {
var body: some View {
Text("MyList")
.navigationBarTitle(Text(verbatim: "MyList"), displayMode: .inline)
.navigationBarItems(leading: Text("<"))
}
}
Однако я теряю возвращаемое изображение по умолчанию и получаю уродливое <вместо этого.
4 ответа
Вам нужно установить заголовок вида, к которому будет возвращаться кнопка "Назад":
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: DetailView()) {
Text("push view")
}
}.navigationBarTitle("", displayMode: .inline)
}
}
}
struct DetailView: View {
var body: some View {
Text("Detail View")
}
}
В качестве альтернативы, чтобы условно установить или снять заголовок исходного представления, в зависимости от статуса презентации, вы можете использовать код ниже.
Помните, что в параметре isActive есть ошибка, но она, скорее всего, скоро будет устранена. Вот ссылка на упомянутую ошибку SwiftUI: NavigationDestinationLink устарела
struct ContentView: View {
@State private var active: Bool = false
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: DetailView(), isActive: $active) {
Text("push view")
}
}.navigationBarTitle(!active ? "View Title" : "", displayMode: .inline)
}
}
}
struct DetailView: View {
var body: some View {
Text("Detail View")
}
}
Вместо того, чтобы возиться с заголовком предыдущего экрана, вы можете просто добавить «основной» элемент на панель навигации и заставить его занимать столько места, что не останется места для текста кнопки «Назад». SwiftUI автоматически продолжит показывать кнопку «Назад», но скроет ее текст:
.toolbar {
ToolbarItem(placement: .principal) { Color.clear }
}
Модификатор панели инструментов SwiftUI гораздо более гибкий, чем модификаторы NavigationBar. Вы не ограничены строковым или текстовым представлением в качестве параметра. Используйте встроенное действие среды «Отклонить» вместо кнопки «Назад». Динамические возможности и работает как шарм.
struct MyList: View {
@Environment(\.dismiss) var dismiss
var body: some View {
Text("Hello, World!")
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button {
dismiss()
} label: {
Text("<")
}
}
ToolbarItem(placement: .principal) {
Text("MyList")
}
}
.navigationBarBackButtonHidden(true)
}
}
Работает на iOS 16
Since you can update NavigationItem inside the init of the View. You can solve this in 2 steps:
- Получите видимый контроллер представления.
// Get Visible ViewController
extension UIApplication {
static var visibleVC: UIViewController? {
var currentVC = UIApplication.shared.windows.first { $0.isKeyWindow }?.rootViewController
while let presentedVC = currentVC?.presentedViewController {
if let navVC = (presentedVC as? UINavigationController)?.viewControllers.last {
currentVC = navVC
} else if let tabVC = (presentedVC as? UITabBarController)?.selectedViewController {
currentVC = tabVC
} else {
currentVC = presentedVC
}
}
return currentVC
}
}
- Обновите NavigationItem внутри инициализации представления.
struct YourView: View {
init(hideBackLabel: Bool = true) {
if hideBackLabel {
// iOS 14+
UIApplication.visibleVC?.navigationItem.backButtonDisplayMode = .minimal
// iOS 13-
let button = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
UIApplication.visibleVC?.navigationItem.backBarButtonItem = button
}
}
}