Ошибка: перечисление case требует, чтобы замыкание соответствовало 'View' - PullRequest
1 голос
/ 06 февраля 2020

Я хочу sh создать UIViewRepresentable с представлениями SwiftUI в качестве подпредставления, и у меня есть следующий код, который можно вставить поверх ContentView пустого проекта SwiftUI в Xcode.

The enum Action прямо сейчас имеет один случай, но является ловушкой для добавления дополнительных действий, которые будут выполняться в updateUIView().

import SwiftUI

struct LegacyView<Content: View>: UIViewRepresentable {
    enum Action {
        case idle
    }

    @Binding var action: Action
    let content: Content

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> UIView {
        let hosting = UIHostingController(rootView: self.content)
        let legacyView = UIView()
        legacyView.addSubview(hosting.view)
        hosting.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        return legacyView
    }

    func updateUIView(_ uiView: UIView, context: Context) {
    }

    class Coordinator: NSObject {
        let parent: LegacyView

        init(_ parent: LegacyView) {
            self.parent = parent
        }
    }
}

struct ContentView: View {
    var body: some View {
        LegacyView(action: .constant(.idle)) {
            Text("Hello, world!")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Однако в первой строке body из ContentView, Я получаю следующую ошибку: Enum case 'idle' requires that '() -> Text' conform to 'View'. Как можно исправить эту ошибку?

1 Ответ

2 голосов
/ 06 февраля 2020

Здесь исправлен код для LegacyView в соответствии с предполагаемым использованием в ContentView ...

struct LegacyView<Content: View>: UIViewRepresentable {
    enum Action {
        case idle
    }

    @Binding var action: Action
    let content: () -> Content // << builder type

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> UIView {
        let hosting = UIHostingController(rootView: self.content()) // << used builder
        let legacyView = UIView()
        legacyView.addSubview(hosting.view)
        hosting.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        return legacyView
    }

    func updateUIView(_ uiView: UIView, context: Context) {
    }

    class Coordinator: NSObject {
        let parent: LegacyView

        init(_ parent: LegacyView) {
            self.parent = parent
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...