Пользовательский элемент UIControl с глобальным состоянием для всех экземпляров - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть контроллер ящика, представляющий меню в приложении iOS. Это меню переключается нажатием кнопок меню (UIButton), доступных на каждом экране.

enter image description here

Как вы можете видеть в макете: кнопки меню могут иметь красную точку, показывающую, что новый контент доступен - для этого случая у меня просто есть два изображения для кнопки меню без точки и с ней.

enter image description here

Я думал о создании пользовательского UIControl с «глобальным» свойством для этой точки. Это правильный путь?

class MenuButton : UIButton {
  static var showNotificationDot : Bool = false
}

1 Ответ

0 голосов
/ 28 апреля 2018

Например, вы можете создать подкласс UIButton и добавить наблюдателя.

class MyButton: UIButton {

    static let notificationKey = NSNotification.Name(rawValue: "MyButtonNotificationKey")

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

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

    fileprivate func subcribeForChangingState() {
        NotificationCenter.default.addObserver(forName: MyButton.notificationKey, object: nil, queue: nil) { notificaton in
            if let state = notificaton.object as? Bool {
                self.changeState(active: state)
            }
        }
    }

    fileprivate func changeState(active: Bool) {
        //change ui of all instances
        print(active)
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

И изменить пользовательский интерфейс из любого места, как это:

NotificationCenter.default.post(name: MyButton.notificationKey, object: true)
...