如何在UITableView单元格textField中更新核心数据值

时间:2019-02-14 17:45:33

标签: ios swift uitableview core-data

我正在设置应用程序的一个非常基本的功能,例如待办事项列表/记事本,用户可以在其中向UITableView添加空白单元格。该单元格将包含创建注释行时的系统时间,并且可以将其注释输入到textField中。

我设法设置了应用程序,以添加一个具有静态系统时间的空白单元格并将文本保存在textField中,但是,经过大量搜索之后,我只是想不出如何保存/持久化textFields值用户完成编辑或添加新的笔记单元格后。

我试图扭转将单元格添加到持久性容器的方式,但这并没有告诉应用程序正在更新的单元格只是创建一个新单元格。

我还不允许发布图片,所以这里是我的描述: 这是一个UITableView,右侧带有一个长条按钮“添加”,一个单元格包含一个UIlabel,左侧包含(systemTime),一个textField(noteLine)填充该单元格的右侧。

|--------------------------------------|
|                 notepad            + |
|--------------------------------------|
|Prototype cell                        |
|--------------------------------------|
|12:17:12 |***textField***            ||
|                                      |
|                                      |
|                                      |
|                                      |
|                                      |
|                                      |
|                                      |
|                                      |
|______________________________________|

我的变量是:

    var frc: NSFetchedResultsController = NSFetchedResultsController<NSFetchRequestResult>()
    var pc = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

这是我的代码,添加了新的“注释行”

func newNoteline() {
        let entityDescription = NSEntityDescription.entity(forEntityName: "Entity", in: pc)

        let item = Entity(entity: entityDescription!, insertInto: pc)

        item.notesheetLine = "Test"
        item.timenoteline = timeOutlet.text

        do {

            try pc.save()
        } catch {
            print(error)
            return
        }
        self.tableView.reloadData()

    }

据此,我尝试保存以下内容,但它不起作用-我猜是因为我没有告诉应用程序要更新哪个单元格。

    func save() {

            let entityDescription = NSEntityDescription.entity(forEntityName: "Entity", in: pc)

            let item = Entity(entity: entityDescription!, insertInto: pc)

            item.notesheetLine = "Test Save"


        do {

            try pc.save()
        } catch {
            print(error)
            return
        }
                self.tableView.reloadData()
    }

我也尝试过这种方法,但还是没有运气:

    func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) {
        let noteline = tableView.dequeueReusableCell(withIdentifier: "notelineIdentifier", for: indexPath!) as! notesheetTableViewCell

        let item = frc.object(at: indexPath!) as! Entity

        item.timeLine = noteline.timeLineOutlet.text

        do {

            try pc.save()
        } catch {
            print(error)
            return
        }
    }

当前,我可以创建一个包含正确时间的新单元格。重新启动应用程序后,它是持久的,但是当我编辑单元格值时,取消选择该单元格或创建新的单元格行后,该值将立即清除。

那么有人可以让我摆脱困境,告诉我什么/是否有一个功能可以让用户在一个单元格中选择一个textField,对其进行编辑,一旦用户完成编辑,它将使用textField值。

1 个答案:

答案 0 :(得分:0)

NSManagedObject对象是引用类型,一种合适的解决方案是将实体项传递到单元格

  • NotesheetTableViewCell(请用大写字母命名)中添加属性

    var entity : Entity!
    
  • cellForRowAt中将模型项传递到单元格

    let item = frc.object(at: indexPath) as! Entity
    cell.entity = item
    
  • NotesheetTableViewCell中,将textDidEndEditing委托方法称为更新entity

  • didEndEditingRowAt中保存上下文。