【问题标题】:UIViewControllerRepresentable - "Protocol cannot be satisfied by a non-final class" - SwiftUIUIViewControllerRepresentable - “非最终类不能满足协议” - SwiftUI
【发布时间】:2020-03-20 00:03:24
【问题描述】:

不确定我是否遗漏了什么或发现了 SwiftUI 错误。这是一件如此简单的事情,它让我发疯。

尝试设置 UIViewControllerRepresentable 但出现以下错误:

协议“视图”要求“_makeView(view:inputs:)”不能被非最终类(“VideoAnswerWrapper”)满足,因为它在非参数、非结果类型位置使用“Self”

协议“视图”要求“_makeViewList(view:inputs:)”不能由非最终类(“VideoAnswerWrapper”)满足,因为它在非参数、非结果类型位置使用“Self”

我试过了:

  • 将“VideoAnswerViewController”切换为 'VideoAnswerWrapper.UIViewControllerType'
  • 重启 Xcode、清除缓存、派生数据等
  • 从一个空白的 ViewController 开始,以确保它不奇怪 故事板问题
  • 关闭 Xcode 版本并尝试 11.4 测试版。
  • 实例化 VideoAnswerViewController 的不同方法
  • 在类中添加“final”

这是我的 UIViewControllerRepresentable 类:

import SwiftUI

class VideoAnswerWrapper: UIViewControllerRepresentable {
    
    typealias UIViewControllerType = VideoAnswerViewController

    private var question : Question!


    init(question: Question?) {
        guard let question = question else {fatalError()}
        self.question = question
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<VideoAnswerWrapper>) -> VideoAnswerViewController {

        let storyboard = UIStoryboard(name: "VideoAnswer", bundle: .main)

        //Downcast returned controller to the requried type
        guard let viewController = storyboard.instantiateInitialViewController() as? VideoAnswerViewController else { fatalError() }

        //Assign selected question object to instance property on incoming viewController.
//        viewController.question = question

        return viewController
    }

    func updateUIViewController(_ uiViewController: VideoAnswerViewController, context: UIViewControllerRepresentableContext<VideoAnswerWrapper>) {
        
    }
}

UIViewController(我已经剥离了所有功能以隔离错误)

import UIKit

class VideoAnswerViewController: UIViewController {

}

【问题讨论】:

  • 如果我将您的代码粘贴到游乐场并将其中的一行更改为final class VideoAnswerWrapper: UIViewControllerRepresentable {,错误就会消失。您确定添加“final”至少不会更改错误吗?
  • @PhillipMills ......我无语了。我已经尝试使 VideoAnswerViewController 最终但不是包装类。我已经坚持了几个小时。谢谢!如果您想要功劳,可以将其作为答案发布。
  • 没关系。我假设投诉是关于VideoAnswerWrapper,因为错误是关于它采用的协议。这不像我确定的那样。 :)
  • @PhillipMills 值得回答,因为肯定会为其他人出现。
  • 通常 UIViewControllerRepresentable 和 UIViewController 应该是结构体。

标签: ios swift xcode swiftui


【解决方案1】:
class VideoAnswerWrapper: UIViewControllerRepresentable {

    typealias UIViewControllerType = VideoAnswerViewController

以上内容旨在呈现 SwiftUI View,因此必须是如下结构

struct VideoAnswerWrapper: UIViewControllerRepresentable {

    typealias UIViewControllerType = VideoAnswerViewController

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多