Тип TextView не соответствует протоколу UIViewRepresentable

Я начал экспериментировать со 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.

Спасибо за вашу помощь

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
2 512
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

После нескольких часов борьбы я узнаю, что было не так.

В моем устаревшем проекте использовалась сторонняя библиотека, которая также ссылалась на класс с именем «Контекст».

В моем случае вместо ссылки на правильный контекст, который должен быть из среды 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 без ошибок:

Кстати, подсказка должна привести меня к проблеме:

  • Ключевое слово Context окрашено в фиолетовый цвет, когда относится к библиотеке SwiftUI.
  • Ключевое слово Context имеет зеленый цвет, когда оно относится к моему собственному классу.

ОМГ ЭТО ^^^^^ Я потратил почти день, пытаясь понять, почему он не компилируется, и это было это!!

user1366265 15.06.2022 21:29

На iOS 16

typealias UIViewType = UITextView

Другие вопросы по теме