一次实例化 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.
主持人负责治国。
我正在创建一个音乐播放器应用程序,我有一个 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.
主持人负责治国。