2017-04-21 1 views
0

Also meine App enthält eine uitableview/uitableviewcell und in der uitableview/uitableviewcell ist eine AVplayer. Ich möchte den Videoplayer pausieren können, wenn die Taste angetippt wird. Als ich den AV-Player zu einer globalen Variable machte, konnte ich das Video anhalten und abspielen, aber das Video wurde beim Scrollen nicht durch das nächste Video ersetzt.Wie übergebe ich Daten eine Funktion von einem programmierten uibutton?

// video player 
    let videoURL = URL(string: uVideoUrl)! 
    let player = AVPlayer(url: videoURL) 
    let playerLayer = AVPlayerLayer(player: player) 
    playerLayer.frame = CGRect(x: cell.backgroundImg.frame.origin.x, y: cell.backgroundImg.frame.origin.y, width: cell.backgroundImg.frame.width - 5, height: cell.backgroundImg.frame.height) 
    cell.layer.addSublayer(playerLayer) 


// play button 
    let playButton = UIButton(frame: CGRect(x: 15, y: 75, width: 30, height: 30)) 
    playButton.setImage(UIImage(named: "playimg.png"), for: .normal) 

    ** playButton.addTarget(self, action: #selector(playVideo(player:player)), for: .touchUpInside) ** 
    cell.addSubview(playButton) 

Hier ist die Funktion zum Abspielen des Videos.

func playVideo(player:AVPlayer) { 
    player.play() 
} 

Der Text/Code mit ** ist der Code, den ich nicht herausfinden können, wie sie mich in den Spieler übergeben lassen, für mich um das Video abzuspielen.

+1

Sie keine Parameter an Selektoren passieren kann –

+0

Können Sie mehr Code in Ihre 'cellForRowAtIndexPath'-Funktion einfügen? –

+0

was genau möchten Sie tun? – KKRocks

Antwort

0

Sie können keine Parameter an Selektoren übergeben, aber es gibt einige Möglichkeiten, dies zu tun.

Hier ist eine Art und Weise durch die Verwendung Notification (swift 3), NSNotification (swift 2.3, usw.)

class ViewController: UIViewController { 
    var player: AVPlayer! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let videoURL = URL(string: uVideoUrl)! 
     player = AVPlayer(url: videoURL) // initialize player that is on the class level scope 
     let playerLayer = AVPlayerLayer(player: player) 
     playerLayer.frame = CGRect(x: cell.backgroundImg.frame.origin.x, y: cell.backgroundImg.frame.origin.y, width: cell.backgroundImg.frame.width - 5, height: cell.backgroundImg.frame.height) 
     cell.layer.addSublayer(playerLayer) 

     let playButton = UIButton(frame: CGRect(x: 15, y: 75, width: 30, height: 30)) 
     playButton.setImage(UIImage(named: "playimg.png"), for: .normal) 
    } 

    func playButtonClicked(sender: UIButton) { 
     let notifName = NSNotification.Name(rawValue: "SOMENOTIFICATIONNAMETHATISUNIQUE") 
     NotificationCenter.default.post(name: notifName, object: nil, userInfo: ["player": player]) 
    } 
} 


class SomeViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let notifName = NSNotification.Name(rawValue: "SOMENOTIFICATIONNAMETHATISUNIQUE") 
     NotificationCenter.default.addObserver(self, selector: #selector(self.playClicked(notification:)), name: notifName, object: nil) 
    } 

    func playClicked(notification: Notification) { 
     if let player = notification.userInfo!["player"] as? AVPlayer { 
      // do stuff with player 
     } 
    } 
} 

Was hier passiert, ist, dass Ihr Spieler nun wie ein Parameter übergeben wird, um die Notification mit ‚s userInfo

0

Sie könnten zusätzliche Daten zu Ihrem UIButton hinzufügen, indem Sie das objektive C zugeordnete Objektsystem verwenden. Der folgende Code fügt UIButton einen zusätzlichen Variablenplayer hinzu. Ich habe das in der Vergangenheit mit Int's gemacht. Habe es nicht mit einem so komplexen Objekt wie AVPlayer versucht, sehe aber keinen Grund, warum das nicht möglich wäre.

private var playerAssociationKey: UInt8 = 0 

extension UIButton { 
    var player: Int! { 
     get { 
      return objc_getAssociatedObject(self, &playerAssociationKey) as? Int 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &playerAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 
} 

Weitere Details finden Sie unter How to have stored properties in Swift, the same way I had on Objective-C?.

0

Der Button sendet sich immer als Argument seiner Aktionsnachricht. Sie können den Player nicht als Argument senden.

Basierend auf dem Code in Ihrer Frage, es sieht aus wie jede Zelle hat eine und eine Schaltfläche. Warum also nicht einfach den Button direkt an den Player senden? Verwenden Sie eine Erweiterung auf AVPlayer eine Play/Pause-Toggle-Methode zu definieren:

extension AVPlayer { 
    func togglePlayPause(_ sender: AnyObject?) { 
     // Normal playback rate is 1. Paused rate is 0. 
     self.rate = 1 - self.rate 
    } 
} 

Dann sagen Sie Ihre Taste, um diese Meldung wie diese an den Spieler zu senden:

playButton.addTarget(player, action: #selector(AVPlayer.togglePlayPause(_:)), for: .touchUpInside) 
+0

Das hat funktioniert !! danke bro –

+0

Ich bin froh, dass ich helfen konnte. Wenn Sie eine Antwort hilfreich finden, laden Sie sie bitte hoch oder klicken Sie auf das Häkchen daneben. –

Verwandte Themen