簡體   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