Sobes.tech
Назад к вопросам
Junior — Middle
64

Каким образом реализовать управление навигацией в SwiftUI при использовании компонентов UIKit?

Ответ от нейросети

sobes.tech AI

В SwiftUI для интеграции UIKit-компонентов и управления навигацией обычно используют UIViewControllerRepresentable для обёртки UIKit-контроллеров. Чтобы управлять навигацией, можно использовать NavigationView и NavigationLink в SwiftUI, а внутри UIKit-компонентов — делегаты или callback для передачи событий навигации обратно в SwiftUI.

Пример: если у вас есть UIKit-контроллер, который должен инициировать переход, вы можете передать в него замыкание, которое вызовет изменение состояния в SwiftUI, а уже SwiftUI обновит навигацию.

struct UIKitWrapper: UIViewControllerRepresentable {
    var onNavigate: () -> Void

    func makeUIViewController(context: Context) -> UIViewController {
        let vc = UIViewController()
        // Настройка vc и добавление кнопки
        let button = UIButton(type: .system)
        button.setTitle("Перейти", for: .normal)
        button.addTarget(context.coordinator, action: #selector(Coordinator.buttonTapped), for: .touchUpInside)
        vc.view.addSubview(button)
        button.center = vc.view.center
        return vc
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}

    func makeCoordinator() -> Coordinator {
        Coordinator(onNavigate: onNavigate)
    }

    class Coordinator: NSObject {
        var onNavigate: () -> Void
        init(onNavigate: @escaping () -> Void) {
            self.onNavigate = onNavigate
        }

        @objc func buttonTapped() {
            onNavigate()
        }
    }
}

struct ContentView: View {
    @State private var isActive = false

    var body: some View {
        NavigationView {
            VStack {
                UIKitWrapper(onNavigate: {
                    isActive = true
                })
                NavigationLink(destination: Text("Новая страница"), isActive: $isActive) {
                    EmptyView()
                }
            }
        }
    }
}

Таким образом, UIKit-компонент сигнализирует SwiftUI о необходимости навигации, а SwiftUI управляет переходом.