У меня есть приложение UIKit, и я перенес некоторые из своих экранов в SwiftUI с помощью UIHostingController. Раньше я мог повторно использовать одну и ту же панель навигации UIKit. Но после перехода на API NavigationStack мне не удалось воспроизвести то же поведение.
Вот полный воспроизводимый код.
импортировать UIKit импортировать SwiftUI структура ListView: Просмотр { @State var selectedString: Строка? = ноль var body: some View { let Details = ["foo", "bar", "baz"] // Нет необходимости переноса под NavigationView, иначе будет двойная панель навигации. // Это будет использовать панель навигации UIKit Список { ForEach(details, id: \.self) {подробнее см. let Destination = Text("Это подробная страница для \(detail)") .navigationTitle("Страница сведений") Навигационная ссылка( деталь, пункт назначения: пункт назначения, тег: деталь, выбор: $selectedString) } } .navigationTitle("Страница списка") } } структура ListViewWithNewAPI: Просмотр { @State var selectedString: Строка? = ноль var body: some View { let Details = ["foo", "bar", "baz"] Навигационный стек { List(details, id: \.self, choice: $selectedString) {подробнее в NavigationLink(подробно, значение: подробно) } .navigationDestination(item: $selectedString) {подробнее см. Text("Это подробная страница для \(detail)") .navigationTitle("Страница сведений") } .navigationTitle("Страница списка") .navigationBarTitleDisplayMode(.inline) } } } класс ViewController: UIViewController { @objc частная функция TapButton1() { пусть listVC = UIHostingController(rootView: ListView()) NavigationController?.pushViewController(listVC, анимированный: true) } @objc частная функция TapButton2() { пусть listVC = UIHostingController(rootView: ListViewWithNewAPI()) NavigationController?.pushViewController(listVC, анимированный: true) } переопределить функцию viewDidLoad() { супер.viewDidLoad() // Выполняем любые дополнительные настройки после загрузки представления. let button1 = UIButton(frame: CGRect(x: 100, y: 100, ширина: 100, высота: 100)) button1.backgroundColor = .green button1.addTarget(self, действие: #selector(tapButton1), для: .touchUpInside) view.addSubview(кнопка1) let button2 = UIButton(frame: CGRect(x: 100, y: 300, ширина: 100, высота: 100)) button2.backgroundColor = .red button2.addTarget(self, действие: #selector(tapButton2), для: .touchUpInside) view.addSubview(button2) NavigationItem.title = "Заголовок UIKit" } }
Файл раскадровки по сути является первоначальным проектом, за исключением того, что я встроил виртуальный виртуальный компьютер в навигационный виртуальный компьютер.

В приведенном выше коде ListView реализован с использованием устаревшего NavigationView, который хорошо работает с UIHostingController. ListViewWithNewAPI — это новая реализация, использующая новый API NavigationStack, и мне не удалось воспроизвести исходное поведение.
Вот видео, в котором сравниваются два варианта поведения. Пожалуйста, используйте пример кода, поэкспериментируйте и посмотрите, сможем ли мы добиться исходного поведения с помощью нового API.
