繁体   English   中英

SwiftUI UIViewRepresentable 的“初始化程序不会覆盖其超类中的指定初始化程序”

[英]SwiftUI "Initializer does not override a designated initializer from its superclass" for UIViewRepresentable

我在我的 SwiftUI 应用程序中使用 UIViewRepresentable 视图来使视频播放器在 SwiftUI 视图中播放。

我需要将资源字符串传递给视频播放器,以便它播放正确的视频,而不是播放 PlayerUIView 中定义的硬编码值。

我得到的错误是 Initializer 在将videoResource: String添加到 PlayerUIView class 内的覆盖 init不会覆盖其超类的指定初始化程序。

我不习惯使用override init()所以我不知道为什么我不能像普通初始化程序一样初始化属性?

如果我在 PlayerUIView 中硬编码视频字符串并从 override init() 中删除 videoResource: String但我不知道为什么我不能将值传递给 override init() ,一切都可以正常工作?

我究竟做错了什么?

struct ContentView: View {
    
    var body: some View {
        VideoPlayerView(resource: "video-name")
    }
}
struct VideoPlayerView: UIViewRepresentable {

    let resource: String

    func makeUIView(context: Context) -> some UIView {
        return PlayerUIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200), videoResource: resource)
    }

    func updateUIView(_ uiView: UIViewType, context: Context) {  }
}
class PlayerUIView: UIView {
      
    private var playerLayer = AVPlayerLayer()
    private var playerLooper: AVPlayerLooper?

    // ERROR -> "Initializer does not override a designated initializer from its superclass"
    override init(frame: CGRect, videoResource: String) {

        super.init(frame: frame)
        
        let fileURL = Bundle.main.url(forResource: videoResource, withExtension: "mp4")!
        let playerItem = AVPlayerItem(url: fileURL)

        let player = AVQueuePlayer(playerItem: playerItem)

        playerLayer.player = player
        playerLayer.videoGravity = .resizeAspectFill
        playerLayer.backgroundColor = UIColor.white.cgColor
        layer.addSublayer(playerLayer)

        playerLooper = AVPlayerLooper(player: player, templateItem: playerItem)

        player.play()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        playerLayer.frame = bounds
    }

    required init(coder: NSCoder) {
        fatalError("init(coder: ) has not been implemented")
    }
}

您需要在此处删除override 那是用来实现超类中实现的一个方法,而超类没有那个init。 正确的声明是(删除override ):

init(frame: CGRect, videoResource: String) { ... }

您还需要更新播放器,例如

   let resource: String

   ...

   func updateUIView(_ uiView: PlayerUIView, context: Context) {  
       uiView.resource = resource
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM