Я начал экспериментировать со SwiftUI в новом чистом проекте.
Внутри этого нового проекта создана структура, соответствующая UIViewRepresentable. Идея состоит в том, чтобы встроить представление UIKit внутрь представления SwiftUI. Все работает нормально.
import SwiftUI
struct ExempleFromSwitfUIBasedProject: View {
@State var text = "Hello World"
var body: some View {
VStack {
TextView(text: $text)
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 44.0)
}
}
}
struct TextView: UIViewRepresentable {
@Binding var text: String
func makeUIView(context: Context) -> UITextView {
return UITextView()
}
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text
uiView.backgroundColor = UIColor.red
}
}
struct ExempleFromSwitfUIBasedProject_Previews: PreviewProvider {
static var previews: some View {
ExempleFromSwitfUIBasedProject()
}
}
Тот же код, видимый в моей среде IDE, чтобы показать отсутствие ошибки
Проблема возникла, когда я пытался внедрить ТОЧНЫЙ ЖЕ КОД (копирование/вставка файла) в свой устаревший проект.
Это приводит меня к следующей ошибке:
Тип TextView не соответствует протоколу UIViewRepresentable.
import SwiftUI
struct ExempleFromLegacyBasedProject: View {
@State var text = "Hello World"
var body: some View {
VStack {
TextView(text: $text)
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 44.0)
}
}
}
struct TextView: UIViewRepresentable {
@Binding var text: String
func makeUIView(context: Context) -> UITextView {
return UITextView()
}
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text
uiView.backgroundColor = UIColor.red
}
}
struct ExempleFromSwitfUIBasedProject_Previews: PreviewProvider {
static var previews: some View {
ExempleFromLegacyBasedProject()
}
}
Тот же код, видимый в моей среде IDE, чтобы показать сработавшую ошибку
Обобщить: В чистом проекте я без проблем использую протокол UIViewRepresentable. В устаревшем проекте, созданном несколько лет назад, я просто копирую тот же файл, что вызывает ошибку компиляции.
Оба проекта имеют минимальную цель развертывания >= iOS 13.
Спасибо за вашу помощь
После нескольких часов борьбы я узнаю, что было не так.
В моем устаревшем проекте использовалась сторонняя библиотека, которая также ссылалась на класс с именем «Контекст».
В моем случае вместо ссылки на правильный контекст, который должен быть из среды SwiftUI.
typealias Context = UIViewRepresentableContext
Xcode имел в виду объект Context, связанный со сторонним классом, а не с SwiftUI.
Способ избавиться от этой проблемы для меня состоял в том, чтобы заменить ключевое слово «Контекст» на
UIViewRepresentableContext<TextView>
Ниже вы можете найти полный обновленный код:
import SwiftUI
struct ExempleFromLegacyBasedProject: View {
@State var text = "Hello World"
var body: some View {
VStack {
TextView(text: $text)
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 44.0)
}
}
}
struct TextView: UIViewRepresentable {
@Binding var text: String
func makeUIView(context: UIViewRepresentableContext<TextView>) -> UITextView {
return UITextView()
}
func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext<TextView>) {
uiView.text = text
uiView.backgroundColor = UIColor.red
}
}
struct ExempleFromSwitfUIBasedProject_Previews: PreviewProvider {
static var previews: some View {
ExempleFromLegacyBasedProject()
}
}
Ниже вы можете увидеть скриншот из IDE без ошибок:
Кстати, подсказка должна привести меня к проблеме:
ОМГ ЭТО ^^^^^ Я потратил почти день, пытаясь понять, почему он не компилируется, и это было это!!
На iOS 16
typealias UIViewType = UITextView
Вам нужно отредактировать свой вопрос, чтобы включить весь соответствующий код в виде текста, используя правильное форматирование кода, а не в виде снимка экрана, в виде минимального воспроизводимого примера, чтобы сделать вопрос по теме.