У меня есть список URL-адресов в SwiftUI. Когда я нажимаю на объект, я представляю полноэкранный видеопроигрыватель. У меня есть @EnvironmentObject
, который обрабатывает некоторые параметры средства просмотра (например, показывать ли временной код). У меня также есть переключатель, который показывает и скрывает временной код (я включил переключатель только в этом примере, поскольку представление временного кода не имеет значения), но каждый раз, когда я меняю переключатель, представление создается снова, что повторно устанавливает AVPlayer
. Это имеет смысл, поскольку я создаю игрока в инициализаторе представления.
Я думал о создании своего собственного ObserveredObject
класса, содержащего AVPlayer
, но я не уверен, как и где я его инициализирую, так как мне нужно дать ему URL-адрес, который я знаю только из инициализатора CustomPlayerView
. Я также думал о настройке плеера как @EnvironmentObject
, но мне кажется странным инициализировать то, что мне может не понадобиться (если пользователь не нажимает на URL-адрес для запуска плеера).
Как правильно создать AVPlayer
в руки VideoPlayer
AVKit? Вот мой пример кода:
class ViewerOptions: ObservableObject {
@Published var showTimecode = false
}
struct CustomPlayerView: View {
@EnvironmentObject var viewerOptions: ViewerOptions
private let avPlayer: AVPlayer
init(url: URL) {
avPlayer = AVPlayer(url: url)
}
var body: some View {
HStack {
VideoPlayer(player: avPlayer)
Toggle(isOn: $viewerOptions.showTimecode) { Text("Show Timecode") }
}
}
}