通过UserDefault设置更新子类UIButton的属性

时间:2017-05-02 17:52:11

标签: ios swift uibutton nsuserdefaults subclass

我已经在整个项目中使用了一个UIButton子类。这些UIButton子类将具有根据用户在设置中选择的内容而更改的边框颜色。该设置随UserDefaults一起保存。

问题: 当我第一次加载应用程序时,按钮边框是正确的颜色 - 但是,当我更改设置(最终更改按钮边框)时 - 没有任何反应。一旦我关闭应用程序并重新打开,按钮才会改变颜色。

我的代码

class CustomSeasonButton: UIButton {
var seasonCold = Bool()
let nsDefaults = UserDefaults.standard
var notification = Notification(name: Notification.Name(rawValue: "themeChanged"))

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        // ...
        self.seasonCold = nsDefaults.bool(forKey: "savedSeasonDefault")
        NotificationCenter.default.addObserver(self, selector: #selector(self.refreshButtonBorder), name: notification.name, object: nil)

        refreshButtonBorder()
    }

func refreshButtonBorder() {
    print("Notification Received")
    if seasonCold {
       seasonCold = false
       self.layer.borderColor = UIColor.blue
    }
    else {
       seasonCold = true
       self.layer.borderColor = UIColor.red
    }
}


}

设置

class SettingsVC: UITableViewController {
//...
    var notification = Notification(name: Notification.Name(rawValue: "themeChanged"))
//...
}

然后在季节选择的IBAction中 - 我有以下内容:

NotificationCenter.default.post(notification)

正如您从上面的代码中看到的那样,按钮边框颜色在蓝色和红色之间切换,具体取决于使用UserDefaults选择的内容。

我可以更改边框颜色的唯一方法是关闭应用程序并重新打开它。

问题: 每次更新设置(UserDefaults)时,如何确保UIButton子类获得边框颜色更改?谢谢!

2 个答案:

答案 0 :(得分:1)

要让您的按钮即时更改,他们必须知道设置已更改。他们必须收听某种广播消息,并在修改设置时采取一些措施。一种方法可能是通过NSNotificationCenter - 创建时所有按钮都可以在默认通知中心收听消息,然后当您注意到设置已更改时,您可以广播消息。

至于上面的代码,请注意您在init方法中设置边框颜色。创建按钮时,该方法只调用一次。这就解释了为什么按钮的边框颜色不会改变......它们的颜色在创建时就已建立。

最后,您可能会感兴趣(如果您不了解它)以了解有关[UIAppearance][1]的更多信息以及它允许​​您一次影响整组控件的颜色和样式的方式

答案 1 :(得分:1)

seasonCold = false {
   didSet {
      refreshButtonBorder()
   }
}


func refreshButtonBorder() {
    if seasonCold {
       self.layer.borderColor = UIColor.blue
    }
    else {
       self.layer.borderColor = UIColor.red
    }
}

并在每次更改userdefaults“savedSeasonDefault”

时设置seasonCold

对于一对多呼叫使用NotificationCenter,子类按钮的每个实例都应该有一个NotificationObserver,并在UserDefaults更改时发布通知

var notification = Notification(name: Notification.Name(rawValue: "seasonChanged"))

从nib或你的init函数唤醒

NotificationCenter.default.addObserver(self, selector: #selector(self.refreshButtonBorder), name: notification.name, object: nil)
每当季节的寒冷变化洒上通知粉尘

NotificationCenter.default.post(notification)