解码后如何恢复UICollectionViewCell中的绑定



我有一个UICollectionViewCell的子类。该单元是在故事板中可视化设计的,有很多组件,这些组件使用故事板绑定到Swift子类中的变量。

Swift类只是提供了从数据源检索的数据中填充组件的逻辑。

例如:

class InfoCollectionViewCell : UICollectionViewCell {
    @IBOutlet weak var mainPanel : UIView!
    @IBOutlet weak var panel1 : UIView!
    @IBOutlet weak var firstName : UILabel!
    @IBOutlet weak var lastName : UILabel!
    @IBOutlet weak var address : UILabel!
    etc ...
    func setVariousProperties(etc) {
        firstName.text = ... etc

数据源做通常的事情:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath)
if let c : InfoCollectionViewCell = cell as? InfoCollectionViewCell {
    c.setVariousProperties(...)
}

我最初只实现了包含"未实现"断言的解码/编码方法,但很明显,偶尔框架会对类进行编码和解码。我在不保存组件的情况下实现了伪编码/解码方法,这导致了在访问组件时出现零值的可预测问题。

因此,似乎需要我对UICollectionViewCell子类中的所有控件逐一进行编码和解码,或者我必须找到更好的方法。

这似乎是浪费时间,因为我实际上不需要(我不认为)保存组件的内容,因为它们无论如何都会被子类重用:我将覆盖数据源中的组件内容will值。

显然,所有控件都是在故事板中定义的。我可以在init方法中手动从故事板中按名称获取它们,但这似乎同样乏味,并使控件和变量的图形链接变得多余。

有更好的方法吗?

我能说"恢复连接"之类的话吗?

编辑:

在发布问题和添加赏金之间,问题停止了。我现在注意到,我的组件的编码方法没有被调用。因此,出于某种原因,框架决定将我的对象序列化并取消序列化,但现在不是了。因此,问题没有发生,我无法提供堆栈跟踪。

可以想象,XCode的一些更新已经修复了这个问题,或者可能是其他问题。

很明显,我仍然担心某个地方潜伏着某种bug。

您不需要为Storyboard中布局和连接的任何控件实现编码/解码。这将在运行时得到处理,并且只要其他所有内容都与准备使用的UI组件正确连接,就可以在collectionView.dequeueReusableCellWithReuseIdentifier之后取回一个单元格。需要检查的是:

  1. 子类在情节提要自定义类部分中指定
  2. reuseIdentifier被定义为与您期望的字符串相匹配
  3. 所有IBOutlets都已连接,并且还应在IBOutlet var行旁边的代码中显示连接

一旦你确保了这些是正确的,试着打印出组件来检查它们是否仍然为零,并在其中放置一些简单的文本来消除任何数据来源问题:

  func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath)
    if let c = cell as? InfoCollectionViewCell{
      print(c.address)
      print(c.firstName)
      print(c.lastName)
      c.firstName.text = "firstName Test"
      c.lastName.text = "lastName Test"
      c.address.text = "address Test"
    }
    return cell
  }
}

最新更新