我有一个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
之后取回一个单元格。需要检查的是:
- 子类在情节提要自定义类部分中指定
- reuseIdentifier被定义为与您期望的字符串相匹配
- 所有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
}
}