我试图找出使用Core Data中的信息填充自定义UITableViewCells的最佳方法。
到目前为止我所做的是在UITableViewCell子类中拥有NSManagedObject的属性。在configureCell:forRowAtIndexPath:
中,我将对象传递给单元格,在单元子类中,我使用对象属性设置单元格。这工作非常好但是当更新managedObjectContext时我有一些随机崩溃,我担心它与某些单元格中的僵尸对象有关。单元本身非常先进,有大量信息,并避免重复代码(在cellForRow:atIndexPath:
中设置单元格)我在子类本身配置单元格。这很好,因为我在我的应用程序和TodayView扩展中使用相同的UITableViewCell子类。做我描述的最好的方法是什么?我的方式'糟糕'吗?我想要一些意见。
我将在下面提供一些简化的代码来描述我正在使用的概念。
class MyTableViewCell: UITableViewCell {
@IBOutlet weak var iconImageView: UIImageView!
@IBOutlet weak var mainTitleLabel: UILabel!
@IBOutlet weak var subTitleLabel: UILabel!
@IBOutlet weak var timeLabel: UILabel!
@IBOutlet weak var checkMarkImageView: UIImageView!
//Object is the NSManagedObject that is passed in at configureCell:atIndexPath
var objectForCell: Object? {
didSet {
if let object = objectForCell {
//Main title
if let title = object.title {
mainTitleLabel.text = title
}
else {
mainTitleLabel.text = "Title empty."
}
//Sub title
if let subTitle = object.subTitle {
subTitleLabel.text = subTitle
}
else {
subTitleLabel.text = "Sub title empty."
}
//Icon image
if let category = object.category {
switch category {
case .Car: iconImageView.image = UIImage(named: "car")
case .Plane: iconImageView.image = UIImage(named: "plane")
case .Boat: iconImageView.image = UIImage(named: "boat")
default: iconImageView.image = UIImage(named: "unknown")
}
}
else {
iconImageView.image = UIImage(named: "unknown")
}
//Dot indication
if let valid = object.valid {
if valid == true {
checkMarkImageView.hidden = false
}
else {
checkMarkImageView.hidden = true
}
}
else {
checkMarkImageView.hidden = true
}
}
}
}
}
class MyTableView : UITableView {
func configureCell(cell: MyTableViewCell, indexPath: NSIndexPath) {
if let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as? Object {
cell.objectForCell = object
}
}
}
以下是通常发生崩溃的堆栈跟踪的最后一部分:
2
UIKit 0x00000001876475a4 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 540
3
UIKit 0x000000018763c08c -[UITableView _updateVisibleCellsNow:isRecursive:] + 2152
4
UIKit 0x00000001874313cc -[UITableView layoutSubviews] + 168
5
UIKit 0x000000018734dd2c -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 568
答案 0 :(得分:0)
虽然您的方法没有任何看似错误(并且崩溃可能与您的代码中的其他问题有关),但是更好的方法是使用NSFetchedResultsController。如果您不了解它,至少要看一下。
哈利