我已经在整个项目中使用了一个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子类获得边框颜色更改?谢谢!
答案 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)