gpt4 book ai didi

ios - BaseController 委托(delegate)在选项卡栏 Controller 内的所有继承 View Controller 中不起作用

转载 作者:行者123 更新时间:2023-11-28 10:16:11 24 4
gpt4 key购买 nike

我很难理解为什么我在基本 Controller 中定义的委托(delegate)在继承的 View Controller 中不起作用。

我有一个 TabBarController,它有 2 个 ViewController。每个 ViewController 都是 BaseController 的子类。

BaseController 实现委托(delegate)并更新标签 View 。

当我启动应用程序并单击“播放”时,FirstVC 更新标签,但是当我将选项卡切换到 SecondVC 时,它开始更新,但是当我再次单击 FirstVC 时,更新卡住了并且不会更新标签,但标签一直在更新在 SecondVC 中。

import Foundation
import AVFoundation

protocol SharedPlayerNotificaions : class {

func willPlay(status: Bool)
func currentPlayTime(timeString: String)
}

class SharedPlayer : NSObject {

static let sharedInstance = SharedPlayer()
private var player : AVPlayer?
weak var delegate : SharedPlayerNotificaions?

override private init() {
super.init()
player = AVPlayer()

}

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "status" {

if player?.status == AVPlayerStatus.Unknown {
delegate?.willPlay(false)
}
if player?.status == AVPlayerStatus.Failed {
print("failed")
delegate?.willPlay(false)
}

if player?.status == AVPlayerStatus.ReadyToPlay {
print("readytoplay")
delegate?.willPlay(true)
}
}
if keyPath == "rate" {
}
if keyPath == "duration" {
}
}

func play(){

player?.play()
let interval = CMTime(value: 1, timescale: 2)
player?.addPeriodicTimeObserverForInterval(interval, queue: dispatch_get_main_queue(), usingBlock: { (progressTime) in
let seconds = CMTimeGetSeconds(progressTime)
let secondsString = String(format: "%02d", Int(seconds % 60))
let minutesString = String(format: "%02d", Int(seconds / 60))
self.delegate?.currentPlayTime("\(minutesString):\(secondsString)")
})
}

func setUrl(urlString: String){

if let url = NSURL(string: urlString){
player = AVPlayer(URL: url)
player?.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.New, context: nil)
player?.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.New, context: nil)
player?.addObserver(self, forKeyPath: "duration", options: NSKeyValueObservingOptions.New, context: nil)
}
}
}

基础 Controller

    class BaseController : UIViewController, SharedPlayerNotificaions {

let label = UILabel()

override func viewDidLoad() {

SharedPlayer.sharedInstance.delegate = self

view.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Left, relatedBy: .Equal, toItem: view, attribute: .Left, multiplier: 1, constant: 10))
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 50))
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 10))

label.text = "00:00"
}


func currentPlayTime(timeString: String) {
dispatch_async(dispatch_get_main_queue()) {
self.label.text = timeString
}
}

func willPlay(status: Bool) {

}
}

第一 View Controller

class FirstViewController: BaseController {


@IBAction func playButton(sender: AnyObject) {

let urlString = "https://someStreamUrl"

SharedPlayer.sharedInstance.setUrl(urlString)
SharedPlayer.sharedInstance.play()

}

}

第二 View Controller

class SecondViewController : BaseController {

override func viewDidLoad() {

super.viewDidLoad()
view.backgroundColor = .redColor()
}
}

最佳答案

主要缺陷是 SharedPlayer 是单例。只有一个例子。它只能有一个代表。但是你创建了两个 View Controller 。两者都试图告诉单个共享 SharedPlayer 实例它是委托(delegate)。第二个获胜。

委托(delegate)模式只有在只有一个委托(delegate)的情况下才有效。在这种情况下,您有两个,因此您不能使用传统的委托(delegate)模式。

有几种可能的解决方案。

  1. 更新 SharedPlayer 以接受委托(delegate)数组而不是单个委托(delegate)。
  2. 使用NSNotificationCenter。让 SharedPlayer 发布通知并让每个 View Controller 注册每个可能的通知。

关于ios - BaseController 委托(delegate)在选项卡栏 Controller 内的所有继承 View Controller 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41287237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com