SwiftUI: тип не соответствует протоколу 'UIViewRepresentable'

Я разрабатываю новое приложение SwiftUI и пытаюсь понять, как сделать этот проект Swift совместимым со SwiftUI: https://github.com/suzuki-0000/SKPhotoBrowser

Проблема в том, что я не могу заставить работать UIViewRepresentable. Я получаю сообщение об ошибке:

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

Вот мой код:

struct PhotoViewer: UIViewRepresentable {

    @Binding var viewerImages:[SKPhoto]
    @Binding var currentPageIndex: Int

    func makeUIView(context: Context) -> SKPhotoBrowser {
        let browser = SKPhotoBrowser(photos: viewerImages)
        browser.initializePageIndex(currentPageIndex)
        browser.delegate = context.coordinator
        return browser
    }

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

    func updateUIView(_ browser: SKPhotoBrowser, context: Context) {
        browser.photos = viewerImages
        browser.currentPageIndex = currentPageIndex
    }

    class Coordinator: NSObject, SKPhotoBrowserDelegate {

        var control: PhotoViewer

        init(_ control: PhotoViewer) {
            self.control = control
        }

        func didShowPhotoAtIndex(_ browser: PhotoViewer) {
            self.control.currentPageIndex = browser.currentPageIndex
        }

    }
}

Что мне здесь не хватает?


person Filipe Sá    schedule 28.04.2020    source источник


Ответы (2)


SKPhotoBrowser является подклассом UIViewController, поэтому вам необходимо согласовать его с UIViewControllerRepresentable, а не UIViewRepresentable

Собственно, отличий не много:

struct PhotoViewer: UIViewControllerRepresentable {

    @Binding var viewerImages:[SKPhoto]
    @Binding var currentPageIndex: Int

    func makeUIViewController(context: Context) -> SKPhotoBrowser {
        let browser = SKPhotoBrowser(photos: viewerImages)
        browser.initializePageIndex(currentPageIndex)
        browser.delegate = context.coordinator
        return browser
    }

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

    func updateUIViewController(_ browser: SKPhotoBrowser, context: Context) {
        browser.photos = viewerImages
        browser.currentPageIndex = currentPageIndex
    }

    class Coordinator: NSObject, SKPhotoBrowserDelegate {

        var control: PhotoViewer

        init(_ control: PhotoViewer) {
            self.control = control
        }

        func didShowPhotoAtIndex(_ browser: PhotoViewer) {
            self.control.currentPageIndex = browser.currentPageIndex
        }

    }
}
person Asperi    schedule 28.04.2020

Может быть, вы забыли явно указать псевдонимы для UIViewType?

person Akki    schedule 28.04.2020
comment
@ FilipeSá а, ты забыл про typealias UIViewControllerType - person Akki; 28.04.2020