Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UICollectionViewCell中添加/删除观察者_Ios_Swift_Observer Pattern_Key Value Observing - Fatal编程技术网

Ios 在UICollectionViewCell中添加/删除观察者

Ios 在UICollectionViewCell中添加/删除观察者,ios,swift,observer-pattern,key-value-observing,Ios,Swift,Observer Pattern,Key Value Observing,我正在使用下面的代码捕获collectionViewCell的帧更改 class MovieCardCollectionViewCell: UICollectionViewCell { override init(frame: CGRect) { super.init(frame: frame) awakeFromNib() } required init?(coder aDecoder: NSCoder) { supe

我正在使用下面的代码捕获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
            }
        }
    }
}
class MovieCardCollectionViewCell:UICollectionViewCell{
重写初始化(帧:CGRect){
super.init(frame:frame)
awakeFromNib()
}
必需的初始化?(编码器aDecoder:NSCoder){
super.init(编码者:aDecoder)
awakeFromNib()
}
重写func awakeFromNib(){
//配置单元格和视图
contentView.addObserver(self,forKeyPath:“frame”,选项:。新建,上下文:unsafemeutablepointer())
}
脱硝{
contentView.removeObserver(self,forKeyPath:“frame”)
}
重写func updateViews(){
//改变一些观点
}
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
如果let key=keyPath{
开关(钥匙){
案例“框架”:
updateViews()
默认值:中断
}
}
}
}
但在发布观察家之前,我仍然得到UIView解除分配的错误

我对其他视图和其他对象使用相同的机制,效果很好


有什么想法吗?

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

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