Swift - 将 UserDefaults 添加到 NotificationCenter
Swift - Adding UserDefaults to NotificationCenter
每当您点击特定的 TableViewCell 以在另一个 [=76 中执行该通知时,我都实施了 NotificationCenter =],对于这个例子,另一个 ViewController 背景颜色变成粉红色,效果很好,但我的问题是如何保存粉红色的状态使用 UserDefaults?
在 ViewController 内部相同
为了更好地阐明这一点:
ViewController #2包含按下时执行动作的TableViewCell
ViewController#1是颜色变为粉色的视图
我想达到什么目的?
使用UserDefaults
在ViewController#1中保存粉红色的状态
ViewController #1 代码
- viewDidLoad
override func viewDidLoad()
{
NotificationCenter.default.addObserver(self, selector: #selector(BrandTableViewController.testNotifcation(notification:)), name:NSNotification.Name(rawValue: "refresh"), object: nil);
}
- 测试通知函数
@objc func testNotifcation(notification: NSNotification) {
table.backgroundColor = UIColor.systemPink
print("This is a message to say it is working")
}
ViewController #2 代码
didSelectRowAt
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.row == 0
{
if traitCollection.userInterfaceStyle == .light
{
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "refresh"), object: nil, userInfo: nil)
self.dismiss(animated: true, completion: nil)
}
else if traitCollection.userInterfaceStyle == .dark
{
...
}
}
}
您可以在调用通知方法时在 UserDefaults
中设置颜色。因此,更新您的代码 ViewController1:
@objc func testNotifcation(notification: NSNotification) {
table.backgroundColor = UIColor.systemPink
let colorData = NSKeyedArchiver.archivedData(withRootObject: UIColor.systemPink)
UserDefaults.standard.set(colorData, forKey: "savedColor")
UserDefaults.standard.synchronize()
print("This is a message to say it is working")
}
然后,在加载视图时,您需要添加代码来获取保存的颜色并将其设置为背景。所以在 ViewController1.
中更新 viewDidLoad
中的代码
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(BrandTableViewController.testNotifcation(notification:)), name:NSNotification.Name(rawValue: "refresh"), object: nil);
if let colorData = UserDefaults.standard.value(forKey: "savedColor") as? Data,
let savedColor = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor
{
table.backgroundColor = savedColor
}
}
希望对您有所帮助。
如果要在UserDefaults
中保存UIColor
,不能直接实现,因为UserDefaults
不能保存类型[=13=的值] 但是我用不同的方式实现了同样的事情
- 首先你必须创建一个
Array
要保存的 UIColor
的 Rob 值,然后你可以将该数组保存在 UserDefaults
中并在任何地方使用它
为此,首先你必须获得 UIColor
的抢劫值
extension UIColor {
func rgb() -> (red:Int, green:Int, blue:Int, alpha:Int)? {
var fRed : CGFloat = 0
var fGreen : CGFloat = 0
var fBlue : CGFloat = 0
var fAlpha: CGFloat = 0
if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
let iRed = Int(fRed * 255.0)
let iGreen = Int(fGreen * 255.0)
let iBlue = Int(fBlue * 255.0)
let iAlpha = Int(fAlpha)
let rgb = (iAlpha << 24) + (iRed << 16) + (iGreen << 8) + iBlue
return (red:iRed, green:iGreen, blue:iBlue, alpha:iAlpha)
} else {
// Could not extract RGBA components:
return nil
}
}}
使用上面的 rob()
函数你可以得到任何 color
的 rob 值如下
let currcol = YourColor.rgb()!
let arrayOfRGB = [currcol.red , currcol.green , currcol.blue]
UserDefaults.standard.set(arrayOfRGB, forKey: "rgbofcolor")
这将保存您想要的颜色的 array
rgb 值,然后在任何 ViewController
中您可以如下使用它
let preColor = UserDefaults.standard.array(forKey: "rgbofcolor") as? [Int]
print("color RGB \n\(String(describing: preColor))\n")
if preColor == nil
{
print("Color is not saved in Userdefaults")
}
else
{
let YourDesiredColor = UIColor(red: CGFloat(Double(preColor![0])/255.0), green: CGFloat(Double(preColor![1])/255.0), blue: CGFloat(Double(preColor![2])/255.0), alpha: 1)
print("Color was saved successfully in UserDedaults")
}
希望对你有帮助......
每当您点击特定的 TableViewCell 以在另一个 [=76 中执行该通知时,我都实施了 NotificationCenter =],对于这个例子,另一个 ViewController 背景颜色变成粉红色,效果很好,但我的问题是如何保存粉红色的状态使用 UserDefaults?
在 ViewController 内部相同为了更好地阐明这一点:
ViewController #2包含按下时执行动作的TableViewCell
ViewController#1是颜色变为粉色的视图
我想达到什么目的?
使用UserDefaults
在ViewController#1中保存粉红色的状态ViewController #1 代码
- viewDidLoad
override func viewDidLoad()
{
NotificationCenter.default.addObserver(self, selector: #selector(BrandTableViewController.testNotifcation(notification:)), name:NSNotification.Name(rawValue: "refresh"), object: nil);
}
- 测试通知函数
@objc func testNotifcation(notification: NSNotification) {
table.backgroundColor = UIColor.systemPink
print("This is a message to say it is working")
}
ViewController #2 代码
didSelectRowAt
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.row == 0
{
if traitCollection.userInterfaceStyle == .light
{
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "refresh"), object: nil, userInfo: nil)
self.dismiss(animated: true, completion: nil)
}
else if traitCollection.userInterfaceStyle == .dark
{
...
}
}
}
您可以在调用通知方法时在 UserDefaults
中设置颜色。因此,更新您的代码 ViewController1:
@objc func testNotifcation(notification: NSNotification) {
table.backgroundColor = UIColor.systemPink
let colorData = NSKeyedArchiver.archivedData(withRootObject: UIColor.systemPink)
UserDefaults.standard.set(colorData, forKey: "savedColor")
UserDefaults.standard.synchronize()
print("This is a message to say it is working")
}
然后,在加载视图时,您需要添加代码来获取保存的颜色并将其设置为背景。所以在 ViewController1.
中更新viewDidLoad
中的代码
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(BrandTableViewController.testNotifcation(notification:)), name:NSNotification.Name(rawValue: "refresh"), object: nil);
if let colorData = UserDefaults.standard.value(forKey: "savedColor") as? Data,
let savedColor = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor
{
table.backgroundColor = savedColor
}
}
希望对您有所帮助。
如果要在UserDefaults
中保存UIColor
,不能直接实现,因为UserDefaults
不能保存类型[=13=的值] 但是我用不同的方式实现了同样的事情
- 首先你必须创建一个
Array
要保存的UIColor
的 Rob 值,然后你可以将该数组保存在UserDefaults
中并在任何地方使用它
为此,首先你必须获得 UIColor
extension UIColor {
func rgb() -> (red:Int, green:Int, blue:Int, alpha:Int)? {
var fRed : CGFloat = 0
var fGreen : CGFloat = 0
var fBlue : CGFloat = 0
var fAlpha: CGFloat = 0
if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
let iRed = Int(fRed * 255.0)
let iGreen = Int(fGreen * 255.0)
let iBlue = Int(fBlue * 255.0)
let iAlpha = Int(fAlpha)
let rgb = (iAlpha << 24) + (iRed << 16) + (iGreen << 8) + iBlue
return (red:iRed, green:iGreen, blue:iBlue, alpha:iAlpha)
} else {
// Could not extract RGBA components:
return nil
}
}}
使用上面的
rob()
函数你可以得到任何color
的 rob 值如下let currcol = YourColor.rgb()! let arrayOfRGB = [currcol.red , currcol.green , currcol.blue] UserDefaults.standard.set(arrayOfRGB, forKey: "rgbofcolor")
这将保存您想要的颜色的
array
rgb 值,然后在任何ViewController
中您可以如下使用它let preColor = UserDefaults.standard.array(forKey: "rgbofcolor") as? [Int] print("color RGB \n\(String(describing: preColor))\n") if preColor == nil { print("Color is not saved in Userdefaults") } else { let YourDesiredColor = UIColor(red: CGFloat(Double(preColor![0])/255.0), green: CGFloat(Double(preColor![1])/255.0), blue: CGFloat(Double(preColor![2])/255.0), alpha: 1) print("Color was saved successfully in UserDedaults") }
希望对你有帮助......