繁体   English   中英

财产观察员迅速改变颜色

[英]Property Observer for color change in 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
       }
}

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

目前,您正在执行此操作

 view.backgroundColor = X

相反,您可能想制作自己的“财产”。

 var mood: UIColor { }

属性可以具有“ didSet”操作...

 var mood: UIColor {
    didSet {
       view.backgroundColor = mood
       print("Hello!")
    }
 }

因此,现在,当您要更改背景颜色时,只需使用“心情”即可。

mood = X

但是,您还可以运行任何其他代码-在该代码中打印Hello。

想象一下,您的程序有100多个位置,您可以在其中进行更改背景颜色的操作

如果使用属性,则只需更改print(“ Hello”)上的代码,即可“立即”更改所有操作。

否则,您必须更改执行此操作的100个位置中的每个位置。

这是编程的真正基础。 请享用!

如果您真的需要观察者,Swift 4提供了一种非常聪明的方法:

  • 声明一个NSKeyValueObservation属性

     var observation : NSKeyValueObservation? 
  • viewDidLoad添加观察者,只要背景颜色发生变化,就执行关闭。

     observation = observe(\\.view.backgroundColor, options: [.new]) { _, change in print(change.newValue!) } 

在Swift中,有两种类型的属性观察器,即:

willSet

didSet

您可以雨燕文档中找到它这里

如果仅需要使用属性观察器打印颜色描述,则可以创建属性并设置其观察器,如下所示:

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

首先,您在这里不需要任何观察者,因为您可以通过调用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)
      }
}

首先像这样添加观察者:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM