具有所有实例的全局状态的自定义 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)
我在 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)