具有所有实例的全局状态的自定义 UIControl 元素
Posted
技术标签:
【中文标题】具有所有实例的全局状态的自定义 UIControl 元素【英文标题】:Custom UIControl element with global state for all instances 【发布时间】:2018-04-28 07:41:17 【问题描述】:我有抽屉控制器在 ios 应用程序中显示菜单。 通过按下每个屏幕上可用的菜单按钮 (UIButton) 来切换此菜单。
正如您在模拟中看到的那样:菜单按钮可以有红点,表示新内容可用 - 对于这种情况,我只是有两个菜单按钮的图像,没有点和带有它。
我想过为这个点制作带有“全局”属性的自定义 UIControl。方法对吗?
class MenuButton : UIButton
static var showNotificationDot : Bool = false
【问题讨论】:
可以为UIButton的不同状态设置不同的图片。例如当您有新内容时,您可以设置按钮的属性 isHighlighted = true 并且它会自动更改图像。 我应该如何通知所有按钮实例改变状态? 您可以在有新内容可用时触发自定义通知,并且具有此按钮的类可以订阅以侦听此通知,从而在您收到通知时更改状态 所以我应该向所有 MenuButton 实例添加通知观察者? 【参考方案1】:例如,您可以创建子类 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)
【讨论】:
以上是关于具有所有实例的全局状态的自定义 UIControl 元素的主要内容,如果未能解决你的问题,请参考以下文章
在 UIControl 中覆盖 isEnabled 以仍然允许触摸
如何让自定义 UIControl 作为推送操作参与 segue?
在警报级别窗口中具有自定义 inputView 的 UIControl