在 Swift 中的自定义单元格中存储/检索核心数据

Posted

技术标签:

【中文标题】在 Swift 中的自定义单元格中存储/检索核心数据【英文标题】:Storing / Retrieving Core Data in Custom Cell in Swift 【发布时间】:2015-02-22 02:18:04 【问题描述】:

我正在编写的 ios 应用程序将日期保存到 Core Data,然后计算 Time Between Today 和 TableView 中显示的 Stored Date

我能够成功检索 Core Data 中的日期并在 TableView 中显示每个 StoredDate 的 TimeBetween。

当我从标准单元更改为自定义单元时会出现问题。我不确定如何将核心数据传输到每个自定义单元实例。或者,如果核心数据自动传输到每个自定义单元格,我不确定如何访问变量。

这就是我在更改为有效的自定义单元之前的方式:

// Generate the cells
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
var cell = tableView.dequeueReusableCellWithIdentifier("Tablecell", forIndexPath: indexPath) as UITableViewCell
let countdownEntry = fetchedResultController.objectAtIndexPath(indexPath) as CountdownEntry

// Grab the elements using the tag
        let labelCountdown:UILabel? = cell.viewWithTag(1) as UILabel?
        let labelName:UILabel? = cell.viewWithTag(2) as UILabel?
        let iconImage:UIImageView? = cell.viewWithTag(3) as UIImageView?

labelCountdown.text = CountdownEngine.timeBetweenDatesRealTime(countdownEntry.date)

在自定义单元格中,我想通过 NSTimer 函数 (see here for how I set this up, if relevant) 每 1 秒调用一次 timeBetweenDatesRealTime 函数(计算存储日期和今天之间的时间并在标签中显示结果),但是我无法访问countdownEntry.date

这是我的自定义单元格类:

import UIKit

class CountdownTableViewCell: UITableViewCell 

// Outlets
@IBOutlet weak var iconImage: UIImageView!
@IBOutlet weak var labelName: UILabel!
@IBOutlet weak var labelCountdown: UILabel!

// Counter Variable
var timeInterval: NSTimeInterval = 0 
    didSet 
        labelCountdown.text = "\(timeInterval)"
    


func updateUI() 
    println("updating custom cell")

    /*
        // Show real-time countdown of time remaining between today and saved date
        labelCountdown.text = CountdownEngine.timeBetweenDatesRealTime(countdownEntry.date)
    
    */



override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code
    println("code from cell called")

    // add listener
    let notificationCenter = NSNotificationCenter.defaultCenter()
    notificationCenter.addObserver(self, selector: Selector("updateUI"), name: "CustomCellUpdate", object: nil)




override func setSelected(selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state


// MARK: self-cleanup
deinit 
    NSNotificationCenter.defaultCenter().removeObserver(self)



【问题讨论】:

【参考方案1】:

如果您使用情节提要配置单元格,则需要将表格视图单元格的类更改为情节提要中的自定义类。

如果您不使用情节提要,您应该使用registerClass:forCellReuseIdentifier: 注册您的自定义单元类

完成此操作后,表格视图应返回您的自定义类,以便您可以修改代码,如下所示: var cell = tableView.dequeueReusableCellWithIdentifier("Tablecell", forIndexPath: indexPath) as CountdownTableViewCell

然后,您可以在CountdownTableViewCell 类中为countdownEntry 创建属性,以便您可以在tableView:cellForRowAtIndex: 中设置该属性。

【讨论】:

所以我正在使用情节提要并在 Identity Inspector 中使用自定义类“CountdownTableViewCell”。我修改了代码:var cell = tableView.dequeueReusableCellWithIdentifier("Tablecell", forIndexPath: indexPath) as CountdownTableViewCell,如上所述,它可以工作。为了创建属性,我将 var countdownEntry:CountdownEntry = CountdownEntry() 添加到 CountdownTableViewCell。在我的表格视图中,我有 let countdownEntry = fetchedResultController.objectAtIndexPath(indexPath) as CountdownEntry 但我遇到了崩溃 error: Failed to call designated initializer on NSManagedObject class 'CountdownEntry' [CountdownEntry date]: unrecognized selector sent to instance 0x7fe373e549e0 Barum 通过消息提供帮助,我想发布最终解决方案以防有人想知道。在生成需要的单元格的tableView中:var cell = tableView.dequeueReusableCellWithIdentifier("Tablecell", forIndexPath: indexPath) as CountdownTableViewCell let countdownEntry = fetchedResultController.objectAtIndexPath(indexPath) as CountdownEntry cell.countdownEntry = countdownEntry 而在自定义单元格中,需要添加var countdownEntry = CountdownEntry?() 关键是这一行cell.countdownEntry = countdownEntry,它将信息传递给自定义单元格。您需要var countdownEntry = CountdownEntry?(),以便设置单元以接收信息。

以上是关于在 Swift 中的自定义单元格中存储/检索核心数据的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableView 单元格中的 UILabel 未随核心数据更改而更新

如何在 Swift 的自定义单元格中获取值组件的 indexPath?

如何在swift ios中的自定义TableView单元格中显示多个字符串值到多个标签?

确定在 Swift 的自定义 listView 单元格中按下了哪个按钮

Swift:如何在动态 UITableView 的自定义单元格中获取滑块的值?

swift UIViewController用于自定义单元格中的按钮