【问题标题】:Instantiate UIView Once and Reuse in All ViewControllers一次实例化 UIView 并在所有 ViewControllers 中重用
【发布时间】:2020-02-27 13:58:40
【问题描述】:

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

我希望能够在不同的 VC:s 中跨我的应用程序使用此栏,但如果不重新启动每个 VC 中的“播放/暂停视图”,我无法弄清楚如何做到这一点。如果我重新启动它,暂停和播放按钮的状态不会通过 VC:s 进行通信。我目前在每个 VC 中创建一个容器视图,并将其分配给名为“PlayBar.swift”的播放/暂停栏类。

这是我当前的带有 xib 的播放/暂停栏的代码:

    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
    }
}

【问题讨论】:

  • 这是否类似于 UITabBar 在您导航到其他视图时保持显示?

标签: ios swift uiview storyboard xib


【解决方案1】:

如果我重新启动它,暂停和播放按钮的状态不会通过 VC:s 进行通信。

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

我目前在每个 VC 中创建一个容器视图,并将其分配给名为“PlayBar.swift”的播放/暂停栏类。

这并没有错,但是如果您的目标是只有一个玩家栏,那么您的架构是倒退的。只有一个带有播放器栏的播放器 vc,并让它包含所有其他 vc。

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

【讨论】:

  • 关于您的第二个建议,这可能意味着创建一个容器视图并将我的 TabBarController 嵌入其中吗?
【解决方案2】:

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

您应该在单例中存储对视图的弱引用,并将视图上的闭包属性设置为演示器中的方法,该方法触发通过视图哈希表的循环和 UI 的更新。

演示者负责管理状态。

【讨论】:

    猜你喜欢
    • 2014-07-10
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2012-08-30
    • 2021-06-29
    相关资源
    最近更新 更多