UIViewControllerRepresentable
Встраивайте в SwiftUI полноценные контроллеры представлений UIKit, например UIImagePickerController.
«UIViewControllerRepresentable» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Что такое UIViewControllerRepresentable?
Подобно UIViewRepresentable, этот протокол оборачивает полноценный UIViewController для использования внутри SwiftUI.
struct ImagePickerView: UIViewControllerRepresentable {
@Binding var image: UIImage?
}makeUIViewController
Создайте и настройте контроллер представления UIKit. Он вызывается один раз, когда SwiftUI впервые отображает обёртку.
func makeUIViewController(context: Context) -> UIImagePickerController {
let vc = UIImagePickerController()
vc.delegate = context.coordinator
return vc
}updateUIViewController
Вызывается при каждом изменении состояния SwiftUI. Передавайте обновлённые значения в существующий контроллер представления.
func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
// Update vc if needed (e.g., change source type)
}dismantleUIViewController
Статический метод очистки, вызываемый перед удалением контроллера представления из иерархии.
static func dismantleUIViewController(_ vc: UIImagePickerController, coordinator: Coordinator) {
vc.dismiss(animated: false)
}Обёртывание UIDocumentPickerViewController
Пример: оберните средство выбора документов, чтобы пользователи могли выбирать файлы и передавать URL обратно в SwiftUI.
struct DocumentPicker: UIViewControllerRepresentable {
@Binding var url: URL?
func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
let picker = UIDocumentPickerViewController(forOpeningContentTypes: [.pdf])
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ vc: UIDocumentPickerViewController, context: Context) {}
}Модальное отображение
Поместите UIViewControllerRepresentable внутрь .sheet для модального отображения.
@State private var showPicker = false
var body: some View {
Button("Pick Image") { showPicker = true }
.sheet(isPresented: $showPicker) {
ImagePickerView(image: $selectedImage)
}
}Пример создания письма
Оберните MFMailComposeViewController, чтобы отображать окно создания письма из SwiftUI.
struct MailView: UIViewControllerRepresentable {
@Binding var isShowing: Bool
func makeUIViewController(context: Context) -> MFMailComposeViewController {
let vc = MFMailComposeViewController()
vc.mailComposeDelegate = context.coordinator
vc.setSubject("Hello from SwiftUI")
return vc
}
func updateUIViewController(_ vc: MFMailComposeViewController, context: Context) {}
}Полноэкранное отображение
Применяйте .fullScreenCover для контроллеров представления, которые должны занимать весь экран.
.fullScreenCover(isPresented: $showCamera) {
CameraViewController()
}Передача замыканий для обратных вызовов
Вместо привязок передавайте обёртке замыкания обратных вызовов для уведомления о событиях.
struct VideoPlayer: UIViewControllerRepresentable {
let url: URL
var onFinish: () -> Void
// Coordinator calls onFinish when playback ends
}Внутренний размер
Контроллеры представления UIKit определяют собственный размер. Используйте модификаторы рамки SwiftUI или предпочтительный размер содержимого контроллера представления.
struct Popover: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
let vc = UIViewController()
vc.preferredContentSize = CGSize(width: 300, height: 200)
return vc
}
func updateUIViewController(_ vc: UIViewController, context: Context) {}
}Распространённые варианты использования
UIViewControllerRepresentable часто используется для UIImagePickerController, MFMailComposeViewController, AVPlayerViewController, UIDocumentPickerViewController и SFSafariViewController.
import SafariServices
struct SafariView: UIViewControllerRepresentable {
let url: URL
func makeUIViewController(context: Context) -> SFSafariViewController {
SFSafariViewController(url: url)
}
func updateUIViewController(_ vc: SFSafariViewController, context: Context) {}
}Проверка знаний
Какой метод SwiftUI вызывает каждый раз, когда входные данные обёртки из SwiftUI изменяются?
Итоги урока
UIViewControllerRepresentable оборачивает полноценные контроллеры представления UIKit. Реализуйте makeUIViewController (создание один раз), updateUIViewController (синхронизация состояния) и при необходимости dismantleUIViewController (очистка). Для обратных вызовов делегатов используйте Coordinator.
Часто задаваемые вопросы
Урок «UIViewControllerRepresentable» бесплатный?
Да — полный текст урока «UIViewControllerRepresentable» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «UIViewControllerRepresentable»?
Встраивайте в SwiftUI полноценные контроллеры представлений UIKit, например UIImagePickerController. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «UIViewControllerRepresentable»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- UIViewRepresentable: обёртка для представлений UIKit
- Шаблон Coordinator для взаимодействия с делегатами
- UIViewControllerRepresentable
- UIHostingController: SwiftUI внутри UIKit