您可以在这里采取几种方法。您可以尝试一下,看看哪一个最适合您。
选项1:正如你所说,你可以包裹avPlayer
在一个新的ObserveredObject
class
class PlayerViewModel: ObservableObject {
@Published var avPlayer: AVPlayer? = nil
}
class ViewerOptions: ObservableObject {
@Published var showTimecode = false
}
@main
struct DemoApp: App {
var playerViewModel = PlayerViewModel()
var viewerOptions = ViewerOptions()
var body: some Scene {
WindowGroup {
CustomPlayerView(url: URL(string: "Your URL here")!)
.environmentObject(playerViewModel)
.environmentObject(viewerOptions)
}
}
}
struct CustomPlayerView: View {
@EnvironmentObject var viewerOptions: ViewerOptions
@EnvironmentObject var playerViewModel: PlayerViewModel
init(url: URL) {
if playerViewModel.avPlayer == nil {
playerViewModel.avPlayer = AVPlayer(url: url)
} else {
playerViewModel.avPlayer?.pause()
playerViewModel.avPlayer?.replaceCurrentItem(with: AVPlayerItem(url: url))
}
}
var body: some View {
HStack {
VideoPlayer(player: playerViewModel.avPlayer)
Toggle(isOn: $viewerOptions.showTimecode) { Text("Show Timecode") }
}
}
}
选项 2:您可以添加avPlayer
到你已经存在的班级ViewerOptions
作为可选属性,然后在需要时初始化它
class ViewerOptions: ObservableObject {
@Published var showTimecode = false
@Published var avPlayer: AVPlayer? = nil
}
struct CustomPlayerView: View {
@EnvironmentObject var viewerOptions: ViewerOptions
init(url: URL) {
if viewerOptions.avPlayer == nil {
viewerOptions.avPlayer = AVPlayer(url: url)
} else {
viewerOptions.avPlayer?.pause()
viewerOptions.avPlayer?.replaceCurrentItem(with: AVPlayerItem(url: url))
}
}
var body: some View {
HStack {
VideoPlayer(player: viewerOptions.avPlayer)
Toggle(isOn: $viewerOptions.showTimecode) { Text("Show Timecode") }
}
}
}
选项 3:让你的avPlayer
一个状态对象,这样它的内存将由系统管理,并且不会重新设置它并使其保持活动状态,直到您的视图存在为止。
class ViewerOptions: ObservableObject {
@Published var showTimecode = false
}
struct CustomPlayerView: View {
@EnvironmentObject var viewerOptions: ViewerOptions
@State private var avPlayer: AVPlayer
init(url: URL) {
_avPlayer = .init(wrappedValue: AVPlayer(url: url))
}
var body: some View {
HStack {
VideoPlayer(player: avPlayer)
Toggle(isOn: $viewerOptions.showTimecode) { Text("Show Timecode") }
}
}
}
选项 4:创建您的avPlayer
当您需要它时对象然后忘记它(不确定这是否是您的最佳方法,但如果您不需要玩家对象执行自定义操作,那么您可以使用此选项)
class ViewerOptions: ObservableObject {
@Published var showTimecode = false
}
struct CustomPlayerView: View {
@EnvironmentObject var viewerOptions: ViewerOptions
private let url: URL
init(url: URL) {
self.url = url
}
var body: some View {
HStack {
VideoPlayer(player: AVPlayer(url: url))
Toggle(isOn: $viewerOptions.showTimecode) { Text("Show Timecode") }
}
}
}