【问题标题】:Where should I add and remove observer in UICollectionViewCell?我应该在哪里添加和删除 UICollectionViewCell 中的观察者?
【发布时间】:2016-01-27 11:27:58
【问题描述】:

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

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

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

我删除了prepareForReuse上的观察者

override func prepareForReuse()
{
    super.prepareForReuse()
    self.someProperty.removeObserver(self, forKeyPath: "objectProperty")
}

但是当我在应用程序的选项卡之间跳转并影响objectProperty 时,单元格不会受到影响。 我调试了代码,发现当我更改选项卡时,调用了单元格的 prepareForReuse ,因此删除了观察者,并且由于未调用单元格设置函数,因此它从未添加回来。那么也许我应该在其他功能中添加或删除观察者?


我尝试将removeObserver 放入deinit 并崩溃并出现以下错误:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'一个实例 0x12eb89dd0 ObservedObject 类的对象被释放,而键值观察者被释放 仍然注册它。当前观察信息: NSKeyValueObservationInfo NSKeyValueObservance 观察者:..关键路径:objectProperty

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

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

【问题讨论】:

  • 你想完成什么?通常,您不应该在作为视图的类中对数据进行任何更改。代表通常是去这里的方式。
  • 嘿,Luda 确实知道在哪里移除观察者了吗?我真的需要知道
  • @Panda,我暂时离开了它。如果您能找到答案,请不要犹豫与我分享 :)

标签: ios swift uicollectionview uicollectionviewcell key-value-observing


【解决方案1】:

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

【讨论】:

  • 同prepareForReuse。当您按下另一个选项卡时,观察者会被删除,但当您返回选项卡时不会添加回来
【解决方案2】:

嘿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()
       }
   }

}

还可以查看我的Question

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多