使用Core Data对象填充UITableViewCells

时间:2015-05-09 16:03:59

标签: ios uitableview swift core-data

我的问题简介:

我试图找出使用Core Data中的信息填充自定义UITableViewCells的最佳方法。 到目前为止我所做的是在UITableViewCell子类中拥有NSManagedObject的属性。在configureCell:forRowAtIndexPath:中,我将对象传递给单元格,在单元子类中,我使用对象属性设置单元格。这工作非常好但是当更新managedObjectContext时我有一些随机崩溃,我担心它与某些单元格中的僵尸对象有关。单元本身非常先进,有大量信息,并避免重复代码(在cellForRow:atIndexPath:中设置单元格)我在子类本身配置单元格。这很好,因为我在我的应用程序和TodayView扩展中使用相同的UITableViewCell子类。做我描述的最好的方法是什么?我的方式'糟糕'吗?我想要一些意见。 我将在下面提供一些简化的代码来描述我正在使用的概念。

我的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
            }

        }

    }
}

}

configureCell的简化代码:atIndexPath :(在cellForRow中调用:):

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

1 个答案:

答案 0 :(得分:0)

虽然您的方法没有任何看似错误(并且崩溃可能与您的代码中的其他问题有关),但是更好的方法是使用NSFetchedResultsController。如果您不了解它,至少要看一下。

哈利