SwiftUI:类型不符合协议“UIViewRepresentable”

Posted

技术标签:

【中文标题】SwiftUI:类型不符合协议“UIViewRepresentable”【英文标题】:SwiftUI: Type does not conform to protocol 'UIViewRepresentable' 【发布时间】:2020-04-28 15:21:01 【问题描述】:

我正在开发一个新的 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
        

    

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

SKPhotoBrowserUIViewController 子类,因此您需要将其与 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
        

    

【讨论】:

【参考方案2】:

也许您忘记明确指定 UIViewType 的类型别名?

【讨论】:

@FilipeSá 啊,你忘了typealias UIViewControllerType

以上是关于SwiftUI:类型不符合协议“UIViewRepresentable”的主要内容,如果未能解决你的问题,请参考以下文章

Text 或 Image 等视图类型如何符合 SwiftUI 中的 View 协议?

类型“ContentView”不符合协议“View”(Xcode - Swift UI)

如何在 SwiftUI 中符合 ButtonStyle 协议?

类型“Favorites.Type”不能符合“Encodable”;只有结构/枚举/类类型可以符合协议

ForEach 在符合 Identifiable 协议后无法在 SwiftUI 中工作

类型 '()' 不能符合 'View';只有 struct/enum/class 类型可以符合使用 swift ui 调用调用函数的协议