Как остановить воспроизведение AVPlayerViewController как UIViewRepresentable после увольнения? - PullRequest
0 голосов
/ 04 ноября 2019

Я создал UIViewRepresentable версию AVPlayerViewController для воспроизведения фильмов с использованием SwiftUI, с предоставленным URL-адресом и возможностью включения / выключения элементов управления. Вот этот код:

struct PlayerViewController: UIViewRepresentable {
    // Provide the player to this swiftui view
    var url: URL
    var showControls: Bool = true

    typealias UIViewType = UIView

    func makeUIView(context: UIViewRepresentableContext<PlayerViewController>) -> UIView {
        let controller = AVPlayerViewController()
        controller.player = AVPlayer(url: url)
        controller.showsPlaybackControls = showControls
        context.coordinator.controller = controller
        return controller.view
    }

    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PlayerViewController>) {
    }

    func makeCoordinator() -> PlayerViewController.Coordinator {
        Coordinator()
    }

    class Coordinator: NSObject {
        var controller: AVPlayerViewController?

        deinit {
            print("deinit coordinator")
        }
    }
}

Проигрыватель является частью подробного представления, которое представляет собой доступ из списка, встроенного в NavigationView, например:

NavigationView {
    List {
        NavigationLink(destination: DetailView(url: URL("url to movie")))
    }
}

DetailView просто создает экземплярыPlayerViewController с предоставленным URL.

Проблема, с которой я сталкиваюсь, заключается в том, что если я проигрываю фильм в DetailView, когда я нажимаю кнопку "Назад", чтобы вернуться с DetailView на главный экран, япо-прежнему можно слышать звук из фильма, который явно воспроизводится за кадром.

Другие вопросы SO указывают на то, что это связано с тем, что ссылка на AVPlayer сохраняется после отклонения вида. Если это правда, я не уверен почему;или, похоже, я не контролирую это.

Если после возвращения к основному виду и прослушивания видео, воспроизводимого в фоновом режиме, я затем нажимаю на другой элемент списка, воспроизведение немедленно останавливается, и ясм. отладочное сообщение «deinit Координатор».

Как я могу остановить воспроизведение, когда PlayerViewController закрывается и пользователь возвращается к основному виду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...