Создайте UIView один раз и используйте его во всех ViewControllers - PullRequest
0 голосов
/ 01 ноября 2019

Я создаю приложение музыкального проигрывателя, и у меня есть панель воспроизведения / паузы для управления музыкой.

Я хочу иметь возможность использовать эту панель в своем приложении в разных VC, но не могу понять, как это сделать, не перезапуская «play / pause-view» в каждом VC. Если я перезапускаю его, состояние кнопки паузы и воспроизведения не связывается через VC: s. В настоящее время я создаю контейнерное представление в каждом VC и назначаю его классу Play / Pause-bar, называемому "PlayBar.swift".

enter image description here

Этомой текущий код для воспроизведения / паузы с 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
    }
}

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Если я перезапустил его, состояние кнопки паузы и воспроизведения не передается через VC: s.

Так сообщите. Это не произойдет само по себе. Передайте информацию о состоянии от одного vc к следующему или сохраните ее в общем месте, где все vcs могут получить к ней доступ.

В настоящее время я создаю контейнерное представление в каждом VC и назначаю его классу Play / Pause-bar, называемому "PlayBar.swift".

Ничего плохого в этом нет,но если ваша цель состоит в том, чтобы иметь только одну панель игроков, тогда ваша архитектура обратная. Имейте только одного игрока vc с панелью игрока, и он содержит все другие vc.

Я дал две противоположные возможности, потому что не ясно, какова ваша цель.

0 голосов
/ 01 ноября 2019

Представления не предназначены для одиночных игр, и вы не должны пытаться использовать их как таковые. Чтобы решить вашу проблему, я бы создал объект стиля презентатора представления, который является одноэлементным и отвечает за создание и настройку ваших представлений, с соответствующими обратными вызовами для обработчика состояний для управления состоянием.

Вы должны хранить слабые ссылки напросмотра в вашем синглтоне и установите свойство closure в представлении для метода в презентаторе, который запускает цикл через хеш-таблицу представления и обновление пользовательского интерфейса.

Презентатор отвечает за управление состоянием.

...