UIBarButton внутри SwiftUI - PullRequest
       2

UIBarButton внутри SwiftUI

0 голосов
/ 26 апреля 2020

Я работаю над интеграцией 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 различных навигационных контроллеров в иерархии. Кто-нибудь пробовал делать это раньше? Есть ли хорошее решение для этого? Я уже потратил больше времени на это, что я готов признать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...