[英]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.