一次实例化 UIView 并在所有 ViewController 中重用

Instantiate UIView Once and Reuse in All ViewControllers

我正在创建一个音乐播放器应用程序,我有一个 play/pause 栏来控制音乐。

我希望能够在不同 VC:s 的应用程序中使用此栏,但不知道如何在每个 VC 中重新启动 "play/pause-view"。如果我重新启动它,暂停和播放按钮的状态不会通过 VC:s 进行通信。我目前在每个 VC 中创建一个容器视图并将其分配给名为 "PlayBar.swift".

的 Play/Pause-bar Class

这是我当前使用 xib 的 play/pause-bar 的代码:

    class PlayBar: UIView {

    let kCONTENT_XIB_NAME = "PlayBarView"
    @IBOutlet weak var playBtnOutlet: UIButton!
    @IBOutlet weak var premiumBtnOutlet: UIButton!
    @IBOutlet weak var timerBtnOutlet: UIButton!
    @IBOutlet var playBarView: UIView!
    static var currentWindow = UIViewController()
    static var currentlyPlaying = false

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()

    }

    func commonInit() {
        Bundle.main.loadNibNamed(kCONTENT_XIB_NAME, owner: self, options: nil)
        playBarView.fixInView(self)
    }

    @objc func playBtnAction(sender: UIButton){

    }
}

extension UIView
{
    func fixInView(_ container: UIView!) -> Void{
        self.translatesAutoresizingMaskIntoConstraints = false;
        self.frame = container.frame;
        container.addSubview(self);
        NSLayoutConstraint(item: self, attribute: .leading, relatedBy: .equal, toItem: container, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: self, attribute: .trailing, relatedBy: .equal, toItem: container, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: container, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: self, attribute: .bottom, relatedBy: .equal, toItem: container, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
    }
}

If i reinitiate it the status of the pause & play-button does not communicate across the VC:s.

所以交流一下。它不会自己发生。将状态信息从一个 vc 传递到下一个,或者将其保存在所有 vc 都可以访问的公共位置。

I currently create a container view in each VC and assign it to the Play/Pause-bar Class called "PlayBar.swift".

这没有错,但是如果您的目标是只有一个播放器栏,那么您的架构就是落后的。只有一个玩家 vc 和玩家栏一起包含所有其他玩家 vc。

我给出了两种相反的可能性,因为不清楚你的目标是什么。

视图并非设计为单例,您不应尝试这样使用它们。为了解决您的问题,我将创建一个视图呈现器样式对象,它是一个单例对象,负责创建和配置您的视图,并适当回调生成器以管理状态。

您应该在您的单例中存储对视图的弱引用,并在视图上设置一个闭包 属性 到演示者中的一个方法,该方法触发视图哈希循环 table 和更新UI.

主持人负责治国。