Я работаю над интеграцией UIBarButton
в SwiftUI View
. Моя причина для этого проста: обычная кнопка SwiftUI, когда используется с .navigationBarItems(trailing:)
, не имеет «эффекта привязки», который вступает в игру с новым трекпадом iPad.
Вот код, который оборачивает навигацию в UIViewControllerRepresentable:
struct NavigationConfigurator: UIViewControllerRepresentable {
var novConfigure: (UINavigationController) -> Void = { _ in }
func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
UIViewController()
}
func setButton(_ uivc: UIViewController){
if let nc = uivc.navigationController {
nc.navigationBar.topItem?.leftBarButtonItem = UIBarButtonItem(title: "Hello", style: .done, target: self, action: nil)
nc.navigationBar.topItem?.rightBarButtonItem = UIBarButtonItem(title: "Goodbye", style: .done, target: self, action: nil)
if let parent = uivc.parent {
setButton(parent)
}
}
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
if let navController = uiViewController.navigationController {
self.novConfigure(navController)
}
}
}
struct SwiftUIView: View {
var body: some View {
NavigationView {
NavigationLink(destination: SwiftUIView2()) {
Text("go")
}
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
struct SwiftUIView2: View {
var body: some View {
NavigationView {
ScrollView {
Text("Hello")
}
.navigationBarTitle("Navigation Bar", displayMode: .inline)
.background(NavigationConfigurator { nc in
nc.navigationBar.topItem?.rightBarButtonItem = UIBarButtonItem(title: "Hello", style: .done, target: self, action: nil)
})
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
Вот GitHub repo , демонстрирующий, что я пытаюсь сделать.
Если вы запустите его, вы увидите, что UIBarButton не использует NavigationController родительского представления, и он не ведет себя, как ожидалось. Метод setupButton ищет родительский NavigationController и принудительно помещает туда кнопку. Я попытался распечатать все NavigationControllers, чтобы он отображал 5 различных навигационных контроллеров в иерархии. Кто-нибудь пробовал делать это раньше? Есть ли хорошее решение для этого? Я уже потратил больше времени на это, что я готов признать.