- 投稿日:2020-03-31T21:19:42+09:00
Swift4以降のKVOについて
はじめに
KVOとは
Key-Value Observing
の略で、対象のObjectの値を監視し、変更のタイミングで通知を行ってくれるものです。
とても簡単に特定の値の監視を行うことができますので、今回はその使い方についてまとめてみました。KVOの使い方
監視の登録方法について
Objectの値の監視を登録するには
observe(_:options:changeHandler:)
を使用します。
各引数の説明を簡単に行います。func observe<Value>(_ keyPath: KeyPath<T, Value>, options: NSKeyValueObservingOptions = [], changeHandler: @escaping (T, NSKeyValueObservedChange<Value>) -> Void) -> NSKeyValueObservation
keyPath
:KeyPath
形式で監視したいObjectの値を指定options
: 変更前後、どの値を通知してもらうか指定するオプションchangeHandler
: Value変更時に呼ばれるHandler
T
: 対象のObjectNSKeyValueObservedChange<Value>
: 監視対象の値の変更時の値を格納実例
では実例を見ていきましょう、使い方は簡単です。
下の例ではview
のframe
の変更時に通知をするよう処理を記述しています。/// インスタンスを保持 var observations = [NSKeyValueObservation]() /// Objectの値の監視を追加 func addKeyValueObserver() { let observation = view.observe(\.frame, options: [.new, .old], changeHandler: { object, change in // value変更時の処理を記載 print("変更前の値: \(change.newValue), 変更後の値: \(change.oldValue)") }) observations.append(observation) } /// 監視を停止し、インスタンスを削除 func removeKeyValueObserver() { // 監視を停止 observations.forEach({ $0.invalidate() }) observations.removeAll() }
options
で設定している値はnew
で変更後の値を通知するよう指定、old
で変更前の値を通知するよう指定できます。
ちなみに変更が通知された際に、変更された値の中身を確認する必要がない場合はoptions:
は省略することができます。
その場合は、newValue
およびoldValue
はnil
になります。KVOの使い所
プロパティを外から監視できる
既存のframeworkのプロパティなど、変化を検知したいが検知するための
delegate
が存在しない場合などは、KVOを使用して該当のプロパティ対して外から監視を行い、プロパティの変更を検知をすることができます。おわりに
KVOを使用することで簡単にプロパティの監視を行うことが出来ますので、是非使い所を見つけて使ってみてください。
参考文献
- 投稿日:2020-03-31T15:05:23+09:00
swiftで角丸のボタンを実装する方法
はじめに
今回も備忘録として残します。
コード実装
test.swiftimport UIKit @IBDesignable class RoundedCornersButton: UIButton { // 角丸の半径(0で四角形) @IBInspectable var cornerRadius: CGFloat = 0.0 // 枠 @IBInspectable var borderColor: UIColor = UIColor.clear @IBInspectable var borderWidth: CGFloat = 0.0 override func draw(_ rect: CGRect) { // 角丸 self.layer.cornerRadius = cornerRadius self.clipsToBounds = (cornerRadius > 0) // 枠線 self.layer.borderColor = borderColor.cgColor self.layer.borderWidth = borderWidth super.draw(rect) } }実装レイアウトに反映する方法
「show the identity inspector」の「custom class」に先ほど作ったClass名を入れる
- 投稿日:2020-03-31T11:48:26+09:00
[Xcode StoryBoard]よく使うけど忘れてしまう設定項目
- 投稿日:2020-03-31T08:39:08+09:00