मेरा ऐप AVFoundation का उपयोग करके कई vcs में वीडियो चलाता है। उदाहरण के लिए फर्स्टकंट्रोलर एक वीडियो चलाता है, फिर उपयोगकर्ता सेकेंडकंट्रोलर पर पुश कर सकता है जो एक वीडियो भी चलाता है, फिर वे थर्डकंट्रोलर पर पुश कर सकते हैं जो एक वीडियो भी चलाता है ... यही बात उनके स्विचिंग टैब पर लागू होगी। TabOne, TabTwo और TabThree पर एक वीडियो स्क्रीन है।

प्रत्येक वर्ग में AVFoundation से जुड़े सभी playLayer कोड को स्थापित करने के बजाय मैंने एक वर्ग बनाया जिसमें एक AVPlayerViewController() है और उस वर्ग को addChildViewController() का उपयोग करके प्रत्येक vc में जोड़ें।

समस्या यह है कि मेरे पास एक वर्ग है जो एवीफ़ाउंडेशन का प्रबंधन करता है Notification.Name.AVPlayerItemDidPlayToEndTime जो खिलाड़ी द्वारा खेलना समाप्त करने पर अधिसूचित हो जाता है, एक वीडियो को एक वीसी पर दूसरे वीडियो से एक अलग वीसी में अलग नहीं कर सकता है। उदाहरण के लिए एक वीडियो के चलने के बाद मैं एक रिप्लेबटन दिखाता हूं। यदि पहले टैब में वीडियो चल रहा है, जब मैं TabTwo पर स्विच करता हूं तो मैं उस वीडियो को रोकता हूं, TabTwo पर वीडियो खत्म होने के बाद और रीप्लेबटन प्रकट होता है, अगर मैं TabOne पर वापस स्विच करता हूं, तो रीप्लेबटन TabOne की स्क्रीन पर भी दिखाई देगा (यह अभी भी होना चाहिए) रोकें बटन दिखाएं)।

समस्या यह है कि भले ही मेरे पास AVFoundationManager के अलग-अलग उदाहरण हैं, सभी इंस्टेंस एक showReplayButton() function तक पहुंचते हैं जो अधिसूचना के सक्रिय होने पर ट्रिगर हो जाता है।

मैं इसके पास कैसे आ सकता हूं?

मुझे पता है कि मैं यह पता लगाने के लिए AVFoundationManager के parent पर जांच कर सकता हूं कि कौन सा अभिभावक इसे प्रबंधित कर रहा है और showReplayButton() फ़ंक्शन के अंदर इसका उपयोग कर रहा हूं, लेकिन मुझे नहीं पता कि इस पर कौन सा चेक चलाना है।

एवीफ़ाउंडेशन प्रबंधक:

class AVFoundationManager: UIViewController {

    ....

    override func viewDidLoad() {
        super.viewDidLoad()
        configureAVPlayerController()
    }

    func configureAVPlayerController() {

        let avPlayerVC = AVPlayerViewController()
        avPlayerVC.player = player
        avPlayerVC.view.frame = view.bounds
        avPlayerVC.showsPlaybackControls = false
        avPlayerVC.videoGravity = AVLayerVideoGravity.resizeAspectFill.rawValue
        addChildViewController(avPlayerVC)
        view.addSubview(avPlayerVC.view)
        avPlayerVC.didMove(toParentViewController: self)

        player?.replaceCurrentItem(with: playerItem!)
        player?.play()

        NotificationCenter.default.addObserver(self, selector: #selector(showReplayButton), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)

        playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status),
                            options: [.old, .new],
                            context: &itemContext)
    }

    @obj func showReplayButton(){

        // if self.parent ... run a bool on the parent and enclose these two in the paranthesis?
        pausePlayButton.isHidden = true
        replayButton.isHidden = false
    }
}

टैबवनक्लास:

let avFoundationManager = AVFoundationManager()
addChildViewController(avFoundationManager)
avFoundationManager.didMove(toParentViewController: self)

TabTwoClass:

let avFoundationManager = AVFoundationManager()
addChildViewController(avFoundationManager)
avFoundationManager.didMove(toParentViewController: self)

TabThree में FirstController (रूट):

let avFoundationManager = AVFoundationManager()
addChildViewController(avFoundationManager)
avFoundationManager.didMove(toParentViewController: self)

TabThree में दूसरा नियंत्रक (बच्चा):

let avFoundationManager = AVFoundationManager()
addChildViewController(avFoundationManager)
avFoundationManager.didMove(toParentViewController: self)
0
Lance Samaria 24 जून 2018, 16:46

2 जवाब

सबसे बढ़िया उत्तर

मुझे यहां से जवाब मिला है

अधिसूचना के अंदर, अंतिम तर्क object को nil पर सेट करने के बजाय इसे player.currentItem पर सेट करें:

इस तरह:

NotificationCenter.default.addObserver(self, selector: #selector(showReplayButton),
                                     name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
                                     object: player?.currentItem)
0
Lance Samaria 8 जुलाई 2018, 01:17

मैं यह नहीं कह रहा हूं कि यह सबसे अच्छा जवाब है, और अगर कोई और बेहतर समाधान के साथ आ सकता है, तो कृपया पोस्ट करें :) मेरी समझ से, खिलाड़ी पर्यवेक्षकों की संख्या के बीच अंतर नहीं कर सकता।

(साइड नोट, वर्तमान में मेरे फोन पर है, इसलिए छद्म कोड के लिए खेद है)

class PlayerViewController {
// other code and functions
    func removeObservers() {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}

viewWillDisappear में पर्यवेक्षकों को हटाने के कार्य को कॉल करें

बस अपने पर्यवेक्षकों की आवश्यकता होने पर उन्हें फिर से शुरू करना याद रखें, या तो जब आपको दृश्य दिखाई दे, या जब आप अगला वीडियो प्रारंभ करें।

0
Paulo 24 जून 2018, 21:00