无法将按钮绑定到 AVPlayer

Posted

技术标签:

【中文标题】无法将按钮绑定到 AVPlayer【英文标题】:Can't bind button to AVPlayer 【发布时间】:2020-06-18 12:45:49 【问题描述】:

我正在尝试快速制作详细视图,但我无法找到使用自定义按钮暂停视频的方法。而且当我回到我的列表时,我仍然可以听到在后台播放的视频。这是我的 AVPlayer 和按钮代码。

 import SwiftUI
 import AVKit

 struct Workdetail: View 



var work: WorkoutDe



   @State var player = AVPlayer()
   @State var isplaying = true




var body: some View 
    
    
    VStack 
    ZStack 
      
        VideoPlayer(player: $player, work: work)
                .frame(height: UIScreen.main.bounds.height / 3.5)
     
        Butto(player: $player, isplaying: $isplaying)
        
    
    Spacer()
    
                   


        
    

 
         struct Butto : View 
                
              @Binding var player : AVPlayer
              @Binding var isplaying : Bool
               
                
                
                var body : some View
                
                
                    Button(action: 
                        
                        if self.isplaying
                            
                            self.player.pause()
                            self.isplaying = false
                        
                        else
                            
                            self.player.play()
                            self.isplaying = true
                        
                        
                    ) 
                        
                        Image(systemName: self.isplaying ? "pause.fill" : "play.fill")
                            .font(.title)
                            .foregroundColor(.white)
                            .padding(20)
                    
                    
                       
                
    



 

    struct VideoPlayer : UIViewControllerRepresentable 
            
        
        var work : WorkoutDe
        
        @Binding var player : AVPlayer
    
                var playerLayer = AVPlayerLayer()
        
         public func makeUIViewController(context: Context) -> AVPlayerViewController 
        
    
               let player = AVPlayer(url: URL(fileURLWithPath: String(work.url)))
            let controller = AVPlayerViewController()
            controller.player = player
            controller.videoGravity = .resizeAspectFill

            player.actionAtItemEnd = .none
            NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main)  _ in
                player.seek(to: CMTime.zero)
              player.play()
              
            
        
            
            
            player.play()
  
            
            return controller
            
        
    
        
        func rewindVideo(notification: Notification) 
             playerLayer.player?.seek(to: .zero)
         
    
    public func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<VideoPlayer>) 
          
          
      

AVPlayer 可以工作,但是当我按下按钮时没有任何反应。按钮的图像发生变化,但视频不会停止播放。 有人可以向我解释一下如何绑定按钮,因为我无法弄清楚

【问题讨论】:

看来你们有两个不同的球员?我看到@State var player 两次。一是在玩;另一个是按钮的目标。 @matt 我将它们都替换为“@Binding”,现在我在主体视图中有一个“@State var player”。但我仍然无法暂停视频。无论如何感谢您的帮助。 我不知道你的代码现在是什么样子的。 @matt 我编辑了这篇文章,现在它包含了缺失的部分。你能帮我把按钮绑定到 AVPlayer 吗? 【参考方案1】:

这里是问题的代码,如果你们正在寻找它。有人在另一个帖子中回答了它:

 public func makeUIViewController(context: Context) -> AVPlayerViewController 

let player = AVPlayer(url: URL(fileURLWithPath: String(work.url)))
let controller = AVPlayerViewController()

DispatchQueue.main.async 
   self.player = player

【讨论】:

以上是关于无法将按钮绑定到 AVPlayer的主要内容,如果未能解决你的问题,请参考以下文章

无法将XAML按钮可见性与C#视图模型专用可见性变量绑定

如何将函数绑定到kv文件中的按钮

将按钮绑定到从 Kivy 到 python 的回调

Windows Phone - 将 TextBox 或其他控件绑定到按钮的 CommandParameter

无法刷新绑定到 DataTable 的 DataGridView

带有单选按钮的 Android 双向数据绑定