Swift中自定义TableViewCell的核心数据图像

时间:2016-06-13 03:59:12

标签: swift image core-data tableview optional

我是Swift和iOS开发的新手,并没有找到我问题的具体答案。

我正在尝试使用核心数据填充包含3个标签和2个图像的自定义表格视图。

我阅读了可选项,甚至在故事板中创建单元格时使用Subtitle选项构建了类似于我现在尝试的内容。这很有效。

My Core Data设置如下所示:

// MARK: - Managed Object Context

var moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

// Initialize Fetch Results

var fetchedResultsController = NSFetchedResultsController()

func fetchRequest() -> NSFetchRequest {

    let fetchRequest = NSFetchRequest(entityName: "Custom")
    let sortDescriptor = NSSortDescriptor(key: "customFourImages", ascending: true)

    fetchRequest.sortDescriptors = [sortDescriptor]

    return fetchRequest
}

// MARK: - Retrieve Request

func getFetchRequest() -> NSFetchedResultsController {

    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: moc!, sectionNameKeyPath: nil, cacheName: nil)

    return fetchedResultsController
}

我的viewDidLoad和viewDidAppear如下所示:

// MARK: - Fetch

    fetchedResultsController = getFetchRequest()
    fetchedResultsController.delegate = self

    do {
        try fetchedResultsController.performFetch()
    } catch {
        print("Failed to Perform Initial Fetch")
        return
    }
    self.tableView.reloadData()

最后,我的cellForRowAtIndexPath看起来像这样:

 // MARK: - Dequeue Reusable Cell

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomTableViewCell

    // MARK: - Initiate Fetch Results for Index Path

    let custom = fetchedResultsController.objectAtIndexPath(indexPath) as! Custom

    let customLabel = custom.customLabels
    let customTwoLabel = custom.customTwoLabels
    let customThreeLabel = custom.customThreeLabels

    let image = UIImage(named: "Custom Food")
    let imageData = UIImagePNGRepresentation(image!)
    custom.customFourImages = imageData

    let images = UIImage(named: "Custom Drink")
    let imagesData = UIImagePNGRepresentation(images!)
    custom.customFiveImages = imagesData

    // MARK: - Set Items in Cell to Returned Fetched Results

    cell.customLabel?.text = "\(customLabel)"
    cell.customTwoLabel?.text = "\(customTwoLabel)"
    cell.customThreeLabel?.text = "\(customThreeLabel)"
    cell.imageView?.image = UIImage(data: custom.customFourImages!)
    cell.imageView?.image = UIImage(data: custom.customFiveImages!)

    return cell
}

我已经尝试过每一个我能想到的排列,并且已经在互联网和StackOverflow上搜索特定的答案。我也不想使用字符串。我正在使用imagePickerController。但即使我的imageAssets中有图像,例如“自定义食品”,“自定义饮品”,图片仍然没有找到。

我无法破解它!

1 个答案:

答案 0 :(得分:1)

根据您的评论,我无法确定您将托管对象实际保存到Core Data的位置。你提到你使用 try.moc?.save()但你是否将你的个人图像保存到核心数据?此外,如果您的图像本地存储在设备中,而不是从URL中提取,那么您实际上并不需要核心数据。

如果您从URL或其他任何内容获取图像,并假设您已使用NSData类型的 imageData 属性添加了实体 MyImage ,则需要像这样保存对象:

class func createInManagedObjectContext(moc: NSManagedObjectContext, imgData: NSData) ->MyImage {
    let newItem = NSEntityDescription.insertNewObjectForEntityForName("MyImage", inManagedObjectContext: moc) as! MyImage
    newItem.imageData = imagData
    return newItem
}

将该功能添加到MyImage.Swift文件(由Core Data生成),这样当您需要将新图像保存到核心数据时,您只需执行以下操作:

func saveNewImage(data: {DATA}){
    MyImage.createInManagedObjectContext(self.managedObjectContext, imgData: data);
}

然后,要获取您的对象:

func getSavedImages() -> [MyImage]? {
    fetchRequest.sortDescriptors = [sortDescriptor]

    do {
        return try self.managedObjectContext.executeFetchRequest(fetchRequest) as? [MyImage]
    } catch {
        print("no records found")
        return nil
    }
}

如果您已经这样做了,请更新您的代码以获取更多详细信息吗?指出你的错误发生的位置(行号)。

如果您的图片在此处失败:

cell.imageView?.image = UIImage(data: custom.customFourImages!)
cell.imageView?.image = UIImage(data: custom.customFiveImages!)

您的获取结果未从Core Data获取记录,这可能是上述问题。

如果你的代码在这里失败了:

let images = UIImage(named: "Custom Drink")
let imagesData = UIImagePNGRepresentation(images!)

你应该使用if let img = images {...}解开你的图像对象,并且很可能错误与你从内存中获取的UIImage的名称有关。

我希望这会有所帮助。

干杯。

编辑1: 回复你的意见: try.moc.save不会保存您的图像,它会保留数据模型中待处理的任何更改。

您需要在核心数据中实际创建托管对象,并且需要确保您的获取请求从Core Data获取相关数据。

您的代码失败,因为customFourImages为零。这个术语来自:

let image = UIImage(named: "Custom Food")
let imageData = UIImagePNGRepresentation(image!)
custom.customFourImages = imageData

....

let images = UIImage(named: "Custom Drink")
let imagesData = UIImagePNGRepresentation(images!)
custom.customFiveImages = imagesData

...

cell.imageView?.image = UIImage(data: custom.customFourImages!)
cell.imageView?.image = UIImage(data: custom.customFiveImages!)

这一切似乎有点多余。

试试这个:

let image = UIImage(named: "Custom Food")
let imageData = UIImagePNGRepresentation(image!)
cell.imageView?.image = image
custom.createInManagedObjectContext(moc, imgData: imageData)
....

let images = UIImage(named: "Custom Drink")
let imagesData = UIImagePNGRepresentation(images!)
cell.imageView?.image = images //this is called in the same block? you are overwriting your imageView in the cell, maybe you have two?
custom.createInManagedObjectContext(moc, imgData: imagesData)

这会将图像保存到Core数据并将正确的图像分配给您的单元格视图(我不确定这是否能满足您将图像数据保存到核心数据的需求)。确保您了解为什么需要使用核心数据并保存适合您要求的适当托管对象。