属性观察器用于swift中的颜色变化

时间:2018-03-22 10:02:33

标签: ios swift

我已经成功创建了一个简单的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
       }
}

请教我如何使用属性观察者在每次更改颜色时监视和打印颜色,因为我没有丝毫想法这样做。

5 个答案:

答案 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)
}