具有所有实例的全局状态的自定义 UIControl 元素

Custom UIControl element with global state for all instances

我在 iOS 应用程序中有抽屉控制器呈现菜单。 通过按每个屏幕上可用的菜单按钮 (UIButton) 可以切换此菜单。

正如您在模拟中看到的那样:菜单按钮可以有红点,表明有新内容可用 - 对于这种情况,我只为菜单按钮设置了两个图像,不带点和带点。

我想过用 "global" 属性 为这个点制作自定义 UIControl。方法对吗?

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

例如,您可以创建子类 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)
    }
}

然后从任何地方更改 UI:

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