Удалить текст с кнопки "Назад" в 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:

  1. Получите видимый контроллер представления.
      // 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
    }
    
}
  1. Обновите 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
        }
    }

}
Другие вопросы по тегам