具有所有实例的全局状态的自定义 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 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有预定义状态的自定义 Quick QML 项目

在 UIControl 中覆盖 isEnabled 以仍然允许触摸

如何让自定义 UIControl 作为推送操作参与 segue?

在警报级别窗口中具有自定义 inputView 的 UIControl

Storyboard 通过全局值访问 UIControl 属性

自定义 UIControl 和手势识别器