add/remove UICollectionViewCell 中的观察者
add/remove Observer in UICollectionViewCell
我正在使用下面的代码来捕捉 collectionViewCell 的帧变化。
class MovieCardCollectionViewCell: UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
awakeFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
awakeFromNib()
}
override func awakeFromNib() {
// configuring cell and views
contentView.addObserver(self, forKeyPath: "frame", options: .New, context: UnsafeMutablePointer<Void>())
}
deinit {
contentView.removeObserver(self, forKeyPath: "frame")
}
override func updateViews() {
// changing some views
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if let key = keyPath {
switch (key) {
case "frame":
updateViews()
default: break
}
}
}
}
但是在观察者被释放之前我仍然得到 UIView 释放的错误。
我对其他视图和其他对象使用了相同的机制,而且效果很好。
有什么想法吗?
awakeFromNib
将在成功加载所有 nib 文件后调用。自己调用 awakeFromNib
,将导致此方法被调用两次,因此将注册两个观察者。
一个好的做法是定义另一个方法,如 func commonInit()
并从两个 init
方法调用 commonInit()
并在 commonInit
中注册观察者
我正在使用下面的代码来捕捉 collectionViewCell 的帧变化。
class MovieCardCollectionViewCell: UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
awakeFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
awakeFromNib()
}
override func awakeFromNib() {
// configuring cell and views
contentView.addObserver(self, forKeyPath: "frame", options: .New, context: UnsafeMutablePointer<Void>())
}
deinit {
contentView.removeObserver(self, forKeyPath: "frame")
}
override func updateViews() {
// changing some views
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if let key = keyPath {
switch (key) {
case "frame":
updateViews()
default: break
}
}
}
}
但是在观察者被释放之前我仍然得到 UIView 释放的错误。
我对其他视图和其他对象使用了相同的机制,而且效果很好。
有什么想法吗?
awakeFromNib
将在成功加载所有 nib 文件后调用。自己调用 awakeFromNib
,将导致此方法被调用两次,因此将注册两个观察者。
一个好的做法是定义另一个方法,如 func commonInit()
并从两个 init
方法调用 commonInit()
并在 commonInit