Ios 我应该在UICollectionViewCell中的何处添加和删除观察者?

Ios 我应该在UICollectionViewCell中的何处添加和删除观察者?,ios,swift,uicollectionview,uicollectionviewcell,key-value-observing,Ios,Swift,Uicollectionview,Uicollectionviewcell,Key Value Observing,在我对UICollectionViewCell生命周期的理解中,我缺少了一些东西 创建和配置UICollectionViewCell后,我会在其一个属性上添加观察者 func setCellDetails(someDetails:SomeObject) { ... self.someProperty.addObserver(self, forKeyPath: "objectProperty", options: .New, context: nil) ... } 我在p

在我对UICollectionViewCell生命周期的理解中,我缺少了一些东西

创建和配置UICollectionViewCell后,我会在其一个属性上添加观察者

func setCellDetails(someDetails:SomeObject)
{
    ...
    self.someProperty.addObserver(self, forKeyPath: "objectProperty", options: .New, context: nil)
    ...
}
我在
prepareforeuse

override func prepareForReuse()
{
    super.prepareForReuse()
    self.someProperty.removeObserver(self, forKeyPath: "objectProperty")
}
但是,当我在应用程序的选项卡之间跳转并影响
objectProperty
时,单元格不会受到影响。 我调试了代码,发现当我更改选项卡时,会调用单元格的prepareForReuse,因此观察者会被删除,并且不会再添加回去,因为没有调用单元格设置函数。也许我应该在其他函数中添加或删除观察者


我试图将
removeObserver
放入
deinit
中,它崩溃了,出现以下错误:

由于未捕获异常而终止应用程序 “NSInternalInconsistencyException”,原因:“实例0x12eb89dd0 类的ObservedObject被解除分配,而键值观察员被取消分配 仍然在它注册。当前观测信息: NSKeyValue观测信息NSKeyValue观测 观察员:。。键路径:objectProperty

我想也许不要把removeObserver放在任何地方。它产生了同样的错误


我该怎么办?我应该把它放在哪里

尝试从集合视图的委托方法中删除观察者:-
集合视图:DiEndDisplayingCell:forItemAtIndexPath:

尝试从集合视图的委托方法中删除观察者:-
集合视图:DiEndDisplayingCell:forItemAtIndexPath:
嘿,Luda终于找到了这个问题的解决方案 您所要做的就是将
AVPlayerItem
子类化,并使用协议将其委托回您的类,下面是我如何完成的

protocol AMPlayerItemDelegate {
    func playbackLikelyToKeepUp()
}

class AMPlayerItem: AVPlayerItem {

   var delegate : MyPlayerItemDelegate?

   init(URL: NSURL) {
       super.init(asset: AVAsset(URL: URL) , automaticallyLoadedAssetKeys:[])
       self.addMyObservers()
   }

   deinit {
       self.removeMyObservers()
   }

   func addMyObservers() {
       print("Adding")
       self.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: [.New], context: nil)
   }

   func removeMyObservers() {
       print("Removing")
       self.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp", context: nil)
   }

   override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
       if keyPath == "playbackLikelyToKeepUp" {
           self.delegate?.playbackLikelyToKeepUp()
       }
   }

}
协议AMPlayerItemDelegate{
func playbackLikelyToKeepUp()
}
类别AMPlayerItem:AVPlayerItem{
变量委托:MyPlayerItemDelegate?
初始化(URL:NSURL){
super.init(资产:AVAsset(URL:URL),automaticallyLoadedAssetKeys:[])
self.addMyObservers()
}
脱硝{
self.removeMoObservers()
}
func addmyobserver(){
打印(“添加”)
addObserver(self,forKeyPath:“playbackLikelyToKeepUp”,选项:[.New],上下文:nil)
}
func RemoveMyObserver(){
打印(“删除”)
self.removeObserver(self,forKeyPath:“playbackLikelyToKeepUp”,上下文:nil)
}
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
如果keyPath==“playbackLikelyToKeepUp”{
self.delegate?.playbackLikelyToKeepUp()
}
}
}

也请查看我的

嘿,Luda终于找到了解决此问题的方法 您所要做的就是将
AVPlayerItem
子类化,并使用协议将其委托回您的类,下面是我如何完成的

protocol AMPlayerItemDelegate {
    func playbackLikelyToKeepUp()
}

class AMPlayerItem: AVPlayerItem {

   var delegate : MyPlayerItemDelegate?

   init(URL: NSURL) {
       super.init(asset: AVAsset(URL: URL) , automaticallyLoadedAssetKeys:[])
       self.addMyObservers()
   }

   deinit {
       self.removeMyObservers()
   }

   func addMyObservers() {
       print("Adding")
       self.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: [.New], context: nil)
   }

   func removeMyObservers() {
       print("Removing")
       self.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp", context: nil)
   }

   override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
       if keyPath == "playbackLikelyToKeepUp" {
           self.delegate?.playbackLikelyToKeepUp()
       }
   }

}
协议AMPlayerItemDelegate{
func playbackLikelyToKeepUp()
}
类别AMPlayerItem:AVPlayerItem{
变量委托:MyPlayerItemDelegate?
初始化(URL:NSURL){
super.init(资产:AVAsset(URL:URL),automaticallyLoadedAssetKeys:[])
self.addMyObservers()
}
脱硝{
self.removeMoObservers()
}
func addmyobserver(){
打印(“添加”)
addObserver(self,forKeyPath:“playbackLikelyToKeepUp”,选项:[.New],上下文:nil)
}
func RemoveMyObserver(){
打印(“删除”)
self.removeObserver(self,forKeyPath:“playbackLikelyToKeepUp”,上下文:nil)
}
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
如果keyPath==“playbackLikelyToKeepUp”{
self.delegate?.playbackLikelyToKeepUp()
}
}
}

还可以查看我的

你想实现什么?通常,作为视图的类中不应该有任何数据突变。在这里,代表通常是最重要的。嘿,卢达已经找到了撤走观察员的办法了吗?我真的需要know@Panda,我把它放在一边了。如果你能找到答案,请毫不犹豫地与我分享:)你想实现什么?通常,作为视图的类中不应该有任何数据突变。在这里,代表通常是最重要的。嘿,卢达已经找到了撤走观察员的办法了吗?我真的需要know@Panda,我把它放在一边了。如果你能找到答案,请毫不犹豫地与我分享:)它与prepareForReuse相同。当您按下另一个选项卡时,观察者将被删除,但当您返回该选项卡时,观察者将不会再添加。这与prepareForReuse相同。当您按下另一个选项卡时,观察者将被删除,但当您返回到该选项卡时,观察者将不会再添加