Назад к вопросам
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 управляет переходом.