【问题标题】:add/remove Observer in UICollectionViewCell在 UICollectionViewCell 中添加/删除观察者
【发布时间】:2016-06-06 19:54:09
【问题描述】:

我正在使用下面的代码来捕捉 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 被释放的错误。

我对其他视图和其他对象使用相同的机制,它工作得很好。

有什么想法吗?

【问题讨论】:

    标签: ios swift observer-pattern key-value-observing


    【解决方案1】:

    awakeFromNib 将在所有 nib 文件成功加载后被调用。自己调用awakeFromNib,会导致这个方法被调用两次,因此会注册两个观察者。

    一个好的做法是定义另一个方法,例如func commonInit(),并从两个init 方法中调用commonInit(),然后在commonInit 中注册观察者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多