我已经成功创建了一个简单的iOS
应用,可以在我点击按钮时更改背景颜色。但。现在的问题是,我不知道如何实现属性观察器,以便在颜色发生变化时将消息打印到颜色的效果。
UIColorExtension.swift
import UIKit
extension UIColor {
static var random: UIColor {
// Seed (only once)
srand48(Int(arc4random()))
return UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0)
}
}
ViewController.Swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// apply random color on view did load
applyRandomColor()
}
@IBAction func btnHandler(_ sender: Any) {
// on each button click, apply random color to view
applyRandomColor()
}
func applyRandomColor() {
view.backgroundColor = UIColor.random
}
}
请教我如何使用属性观察者在每次更改颜色时监视和打印颜色,因为我没有丝毫想法这样做。
答案 0 :(得分:3)
目前你正在做这个
view.backgroundColor = X
相反,你可能想制作自己的"属性" ....
var mood: UIColor { }
属性可以有一个" didSet"行动...
var mood: UIColor {
didSet {
view.backgroundColor = mood
print("Hello!")
}
}
现在,只需使用"心情"当你想改变背景颜色时。
mood = X
但是,你也可以运行任何其他代码 - 它打印Hello。
想象一下,您的程序有100个地方可以让您更改背景颜色。
如果你使用一个属性,你可以改变所发生的事情"所有这一切"只需更改打印时的代码(" Hello")。
否则,您必须更改您这样做的100个地方中的每一个。
这是编程的真正基础。享受!
答案 1 :(得分:2)
如果你真的需要观察者,Swift 4提供了一种非常聪明的方法:
声明NSKeyValueObservation
属性
var observation : NSKeyValueObservation?
在viewDidLoad
中添加观察者,只要背景颜色发生变化,就会执行闭包。
observation = observe(\.view.backgroundColor, options: [.new]) { _, change in
print(change.newValue!)
}
答案 2 :(得分:1)
在Swift中有两种类型的属性观察者,即:
将设置
didSet
您可以在Swift文档here中找到它。
如果你只需要使用属性观察者打印颜色描述,那么你可以创建属性并设置它的观察者:
var backgroundColor = UIColor() {
didSet {
print("didSet value : \(backgroundColor)")
}
}
,您的完整代码如下:
import UIKit
class ViewController: UIViewController {
var backgroundColor = UIColor() {
didSet {
print("didSet value : \(backgroundColor)")
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.applyRandomColor()
}
@IBAction func btnHandler(_ sender: Any) {
// on each button click, apply random color to view
applyRandomColor()
}
func applyRandomColor() {
backgroundColor = UIColor.random
self.view.backgroundColor = backgroundColor
}
}
extension UIColor {
static var random: UIColor {
// Seed (only once)
srand48(Int(arc4random()))
return UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue:
CGFloat(drand48()), alpha: 1.0)
}
}
答案 3 :(得分:1)
首先,您不需要任何观察者,因为您知道颜色何时发生变化,因为您通过调用applyRandomColor()
函数手动更改颜色。所以无论你想做什么,你都可以在这里做。
之后如果你还想看看观察者是如何工作的。然后在要在其中观察此事件的类中添加一个观察者。
view.addObserver(self, forKeyPath: "backgroundColor", options: NSKeyValueObservingOptions.new, context: nil)
这是事件:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "backgroundColor" {
/// Background color has changed
/// Your view which backgroundColor it is
guard let view = object as? UIView else {return}
print(view.backgroundColor)
OR
guard let color = change?[.newKey] as? UIColor else {return}
print(color)
}
}
答案 4 :(得分:1)
首先添加像这样的观察者:
view.addObserver(self, forKeyPath: "backgroundColor", options: [.new], context: nil)
然后覆盖函数:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let color = change?[.newKey] as? UIColor else {return}
print(color)
}